Иконки в меню
Android поддерживает в меню не только текст, но и изображения. Однако, иконки можно добавить только в обычное меню, ни в подменю, ни в расширенном, ни в контекстном отображаться они не будут (хотя и ошибки не вызовут).
Добавить иконку можно с помощью метода setIcon (int resourceId) класса MenuItem.
Например так
- MenuItem item = menu.add (Menu.FIRST, 1, 1, "SubMenu");
- item.setIcon(R.drawable.submenu);
или более коротко
- menu.add (Menu.FIRST, 1, 1, "SubMenu").setIcon(R.drawable.submenu);
Изображения можно использовать как вместе с текстом, так и отдельно. Например так:
Контекстное меню
Контекстное меню — меню вызываемое при длительном нажатие на какой-то элемент интерфейса (View).
Для этого надо зарегистрировать View, к которому будет относиться контекстное меню. При создании проекта android в eclipse создается деятельность (Activity) с одним элементом TextView. Привяжем к нему контекстное меню
- public class JustMenu extends Activity {
- TextView label;
- Menu myMenu;
- ...
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- label = (TextView)findViewById(R.id.label);
- // Регистрируем label для вызова контекстного меню
- registerForContextMenu(label);
- }
- ...
- }
Для создания контекстного меню используется метод void onCreateContextMenu (ContextMenu menu, View v, ContextMenuInfo menuInfo)
где menu — готовое меню (аналогично как в методе onCreateOptionsMenu())
v — View, который сгенерировал вызов контекстного меню
menuInfo — это один из способов, которым View может передать дополнительную информацию в контекстное меню. В простых приложениях его можно просто игнорировать.
- @Override
- public void onCreateContextMenu (ContextMenu menu, View v, ContextMenuInfo menuInfo) {
- menu.setHeaderTitle("Context Menu");
- menu.setHeaderIcon(R.drawable.context);
- menu.add(Menu.FIRST , 200, 200, "Red");
- menu.add(Menu.FIRST, 201, 201, "Green");
- menu.add(Menu.FIRST, 202, 202, "Blue");
- }
Для обработки нажатия на пункт меню используется метод boolean onContextItemSelected (MenuItem item), работа с которым аналагична onOptionsItemSelected
- @Override
- public boolean onContextItemSelected (MenuItem item) {
- if (item.getItemId() == 200) {
- label.setBackgroundColor(Color.RED);
- }
- else if (item.getItemId() == 201) {
- label.setBackgroundColor(Color.GREEN);
- }
- else if (item.getItemId() == 202) {
- label.setBackgroundColor(Color.BLUE);
- }
- return true;
- }
В соответствии с выбранным пунктом контекстного меню, меняем фон у текстового элемента.
XML разметка меню
Меню также как и разметку деятельности (Activity) можно создать в xml. Такие файлы помещаются в /res/menu и для них автоматически генерируется ID ресурса, например R.menu.my_menu
Наше меню можно описать в xml так:
- <?xml version="1.0" encoding="utf-8"?>
- <menu xmlns:android="http://schemas.android.com/apk/res/android">
- <group android:id="@+id/groupFirst">
- <item android:id="@+id/submenu"
- android:icon="@drawable/submenu"
- android:title="Submenu" >
- <menu>
- <item android:id="@+id/submenu1"
- android:title="SubMenu 1" />
- <item android:id="@+id/submenu2"
- android:title="SubMenu 2" />
- <item android:id="@+id/submenu3"
- android:title="SubMenu 3" />
- </menu>
- </item>
- <item android:id="@+id/disable"
- android:title="Disable Items" />
- <item android:id="@+id/hide"
- android:title="Hide Items" />
- <item android:id="@+id/checkable"
- android:title="Set Checkable Items" />
- <item android:id="@+id/remove"
- android:title="Remove Items" />
- </group>
- <group android:id="@+id/groupSecondary">
- <item android:id="@+id/item1"
- android:title="Item 1" />
- <item android:id="@+id/item2"
- android:title="Item 2" />
- <item android:id="@+id/item3"
- android:title="Item 3" />
- </group>
- </menu>
Автоматически генерируются id для каждого элемента и группы, например R.id.submenu или R.id.groupSecondary
Что бы загрузить xml разметку меню используется класс MenuInflater. Вначале получаем экземпляр класса MenuInflater от текущей деятельности (Activity), а затем с помощью метода inflate(int resourceId, Menu menu) загружаем разметку в меню
Таким образом метод onCreateOptionsMenu сокращается:
- public boolean onCreateOptionsMenu(Menu menu) {
- myMenu = menu;
- MenuInflater mInflater = getMenuInflater();
- mInflater.inflate(R.menu.my_menu, menu);
- return true;
- }
Затем в методе onOptionsItemSelect() используем сгенерированные id
- public boolean onOptionsItemSelected (MenuItem item) {
- // вместо if (item.getItemId() == 1)
- if (item.getItemId() == R.id.submenu) {
- // Submenu
- }
- // вместо if (item.getItemId() == 2)
- if (item.getItemId() == R.id.disable) {
- isGroupEnabled = !isGroupEnabled;
- // вместо myMenu.setGroupEnabled(Menu.CATEGORY_SECONDARY, isGroupEnabled);
- myMenu.setGroupEnabled(R.id.groupSecondary, isGroupEnabled);
- item.setTitle (isGroupEnabled ? "Disable Items" : "Enable Items");
- }
- // и т. д.
- ...
- }
Исходники:
создание меню в коде
создание меню в xml
Комментариев нет:
Отправить комментарий