Главная » Разработка для Android » Создание дочерних меню

0

Дочерние  меню отображаются в виде обычных объектов  MenuItems, при выборе которых появляются новые пункты. В традиционных систе- мах дочерние меню выводятся на экран в качестве древовидной иерархии. Но Android использует другой подход, упрощая процесс навигации по меню на устройствах  с небольшими экранами.  Вместо древовидной структуры при выборе дочернего меню появляется единственное  всплывающее  окно, отображающее все пункты.

Добавить дочернее меню можно с помощью метода addSubMenu. Он под- держивает  тот же набор параметров,  что и метод add, применяемый при добавлении обычных пунктов, позволяет указывать группу, уникальный идентификатор и текстовую строку для каждого дочернего меню. Вы также можете использовать методы setHeaderIcon и setIcon  для задания  изобра- жений, которые будут выводиться  в заголовочной строке всплывающего окна и в меню со значками  соответственно.

Объекты  MenuItem в данном случае поддерживают те же параметры, что и пункты для других видов меню (расширенных и со значками). Однако в отличие от традиционных систем вложенные  меню в Android не поддер- живаются.

В следующем  фрагменте  кода представлена  выдержка  из реализации обработчика onCreateMenuOptions — добавление дочернего меню в главное. При этом для дочернего меню создается  новый пункт и устанавливается заголовочный значок.

SubMenu sub = menu.addSubMenu(0, 0, Menu.NONE, "Submenu"); sub.setHeaderIcon(R.drawable.icon); sub.setIcon(R.drawable.icon);

MenuItem submenuItem = sub.add(0, 0, Menu.NONE, "Submenu Item");

Использование контекстного меню

Контекстное меню привязывается к выделенному Представлению и выво- дится на экран при нажатии трекбола, средней кнопки манипулятора D-pad или на элемент  интерфейса (последний должен  удерживаться в течение примерно трех секунд).

Заполнение контекстных и главных меню во многом похоже. Есть два способа создать контекстное меню для конкретного Представления.

Создание контекстного меню. Первый подход — создание обобщенного объекта ContextMenu для класса View, в котором переопределяется обра- ботчик onCreateContextMenu, как показано ниже:

@Override

public void onCreateContextMenu(ContextMenu menu) { super.onCreateContextMenu(menu); menu.add("ContextMenuItem1");

}

Контекстное меню будет доступно внутри Активности, содержащей этот класс View.

Шире используется создание контекстных меню для конкретных Активностей путем переопределения обработчика  onCreateContextMenu и регистрации с помощью метода registerForContextMenu Представлений, которые это меню могут использовать.  Данный процесс показан в ли- стинге 4.29.

Листинг 4.29. Назначение контекстного  меню для Представления

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

EditText view = new EditText(this);

setContentView(view);

registerForContextMenu(view);

}

После  регистрации Представления обработчик  onCreateContextMenu будет срабатывать  при первом отображении контекстного  меню для этого объекта View.

Переопределите метод onCreateContextMenu и проверьте, какое именно Представление его вызвало, чтобы иметь возможность заполнить меню соот- ветствующими пунктами, как показано в дополнении к листингу 4.29:

@Override

public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {

super.onCreateContextMenu(menu, v, menuInfo);

menu.setHeaderTitle("Context Menu");

menu.add(0, menu.FIRST, Menu.NONE,

"Item 1").setIcon(R.drawable.menu_item);

menu.add(0, menu.FIRST+1, Menu.NONE, "Item 2").setCheckable(true); menu.add(0, menu.FIRST+2, Menu.NONE, "Item 3").setShortcut(‘3′, ‘3’); SubMenu sub = menu.addSubMenu("Submenu");

sub.add("Submenu Item");

}

Как видно из примера классы ContextMenu и Menu поддерживают один и тот же метод add, поэтому способ заполнения этих видов меню ничем не отличается.  Заметьте,  что значки при этом отображаться не будут. Од- нако вы можете указать название и значок, которые будут выводиться в за- головочной строке контекстного  меню.

Android  также поддерживает динамическое  заполнение  контекстных меню с помощью Фильтров намерений. Данный механизм позволяет  запол- нять контекстные меню, указывая, какой тип данных представляет текущий объект View, и опрашивая другие приложения на предмет каких-либо дей- ствий для него.

Наиболее яркий пример этого механизма — пункты меню ????????/??- ????????/????????, доступные  в элементах EditText. Использование Фильтров намерений для заполнения контекстных меню подробно рассматривается в следующей главе.

Выбор пунктов в контекстном меню обрабатывается так же, как и в ме- ню для Активностей. Вы можете прикреплять Намерения или интерфейс OnMenuItemClickListener напрямую  к каждому объекту MenuItem, а так- же воплотить  более предпочтительный подход — переопределение метода onContextItemSelected, принадлежащего Активности.

Данный обработчик событий срабатывает каждый раз, когда в контекст- ном меню выбирается  какой-то пункт.

@Override

public boolean onContextItemSelected(MenuItem item) {

super.onContextItemSelected(item);

[ … Обработка выбора пункта в меню … ]

return false;

}

Источник: Майер P. Android 2 : программирование приложений для планшетных компьютеров и смартфонов : [пер. с англ. ] / Рето Майер. — М. : Эксмо, 2011. — 672 с. — (Мировой компьютерный бестселлер).

По теме:

  • Комментарии