понедельник, 5 сентября 2011 г.

Меню (Часть 2)

В Меню (Первая часть) мы рассмотрели как создать меню и подменю, а также как выполнять действия по нажатию на пункты меню. В этой части описаны иконки в меню, контекстное меню и загрузка меню из xml-файла.


Иконки в меню
Android поддерживает в меню не только текст, но и изображения. Однако, иконки можно добавить только в обычное меню, ни в подменю, ни в расширенном, ни в контекстном отображаться они не будут (хотя и ошибки не вызовут).
Добавить иконку можно с помощью метода setIcon (int resourceId) класса MenuItem.
Например так
  1. MenuItem item = menu.add (Menu.FIRST, 11"SubMenu");  
  2. item.setIcon(R.drawable.submenu);  

или более коротко
  1. menu.add (Menu.FIRST, 11"SubMenu").setIcon(R.drawable.submenu);  


Изображения можно использовать как вместе с текстом, так и отдельно. Например так:



Контекстное меню
Контекстное меню — меню вызываемое при длительном нажатие на какой-то элемент интерфейса (View).
Для этого надо зарегистрировать View, к которому будет относиться контекстное меню. При создании проекта android в eclipse создается деятельность (Activity) с одним элементом TextView. Привяжем к нему контекстное меню
  1. public class JustMenu extends Activity {  
  2.       
  3.     TextView label;  
  4.     Menu myMenu;  
  5.   
  6.     ...  
  7.       
  8.     @Override  
  9.     public void onCreate(Bundle savedInstanceState) {  
  10.         super.onCreate(savedInstanceState);  
  11.         setContentView(R.layout.main);  
  12.           
  13.         label = (TextView)findViewById(R.id.label);  
  14.         // Регистрируем label для вызова контекстного меню  
  15.         registerForContextMenu(label);  
  16.     }  
  17.     ...  
  18. }  

Для создания контекстного меню используется метод void onCreateContextMenu (ContextMenu menu, View v, ContextMenuInfo menuInfo)
где menu — готовое меню (аналогично как в методе onCreateOptionsMenu())
v — View, который сгенерировал вызов контекстного меню
menuInfo — это один из способов, которым View может передать дополнительную информацию в контекстное меню. В простых приложениях его можно просто игнорировать.
  1. @Override  
  2. public void onCreateContextMenu (ContextMenu menu, View v, ContextMenuInfo menuInfo) {  
  3.    menu.setHeaderTitle("Context Menu");  
  4.    menu.setHeaderIcon(R.drawable.context);  
  5.   
  6.    menu.add(Menu.FIRST , 200200"Red");  
  7.    menu.add(Menu.FIRST, 201201"Green");  
  8.    menu.add(Menu.FIRST, 202202"Blue");  
  9. }  

Для обработки нажатия на пункт меню используется метод boolean onContextItemSelected (MenuItem item), работа с которым аналагична onOptionsItemSelected
  1. @Override  
  2.     public boolean onContextItemSelected (MenuItem item) {  
  3.         if (item.getItemId() == 200) {  
  4.             label.setBackgroundColor(Color.RED);  
  5.         }  
  6.         else if (item.getItemId() == 201) {  
  7.             label.setBackgroundColor(Color.GREEN);  
  8.         }  
  9.         else if (item.getItemId() == 202) {  
  10.             label.setBackgroundColor(Color.BLUE);  
  11.         }  
  12.         return true;  
  13.     }  

В соответствии с выбранным пунктом контекстного меню, меняем фон у текстового элемента.



XML разметка меню
Меню также как и разметку деятельности (Activity) можно создать в xml. Такие файлы помещаются в /res/menu и для них автоматически генерируется ID ресурса, например R.menu.my_menu
Наше меню можно описать в xml так:
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <menu xmlns:android="http://schemas.android.com/apk/res/android">  
  3.     <group android:id="@+id/groupFirst">  
  4.     <item android:id="@+id/submenu"  
  5.         android:icon="@drawable/submenu"  
  6.         android:title="Submenu" >  
  7.         <menu>  
  8.             <item android:id="@+id/submenu1"  
  9.                 android:title="SubMenu 1" />  
  10.             <item android:id="@+id/submenu2"  
  11.                 android:title="SubMenu 2" />  
  12.             <item android:id="@+id/submenu3"  
  13.                 android:title="SubMenu 3" />  
  14.         </menu>  
  15.     </item>  
  16.     <item android:id="@+id/disable"  
  17.         android:title="Disable Items" />  
  18.     <item android:id="@+id/hide"  
  19.         android:title="Hide Items" />  
  20.     <item android:id="@+id/checkable"  
  21.         android:title="Set Checkable Items" />  
  22.     <item android:id="@+id/remove"  
  23.         android:title="Remove Items" />  
  24.     </group>  
  25.     <group android:id="@+id/groupSecondary">  
  26.         <item android:id="@+id/item1"  
  27.             android:title="Item 1" />  
  28.         <item android:id="@+id/item2"  
  29.             android:title="Item 2" />  
  30.         <item android:id="@+id/item3"  
  31.             android:title="Item 3" />  
  32.     </group>  
  33. </menu>  

Автоматически генерируются id для каждого элемента и группы, например R.id.submenu или R.id.groupSecondary

Что бы загрузить xml разметку меню используется класс MenuInflater. Вначале получаем экземпляр класса MenuInflater от текущей деятельности (Activity), а затем с помощью метода inflate(int resourceId, Menu menu) загружаем разметку в меню

Таким образом метод onCreateOptionsMenu сокращается:
  1. public boolean onCreateOptionsMenu(Menu menu) {  
  2.           
  3.     myMenu = menu;  
  4.           
  5.     MenuInflater mInflater = getMenuInflater();  
  6.     mInflater.inflate(R.menu.my_menu, menu);  
  7.     return true;  
  8. }  

Затем в методе onOptionsItemSelect() используем сгенерированные id
  1. public boolean onOptionsItemSelected (MenuItem item) {  
  2.   
  3.     // вместо if (item.getItemId() == 1)  
  4.     if (item.getItemId() == R.id.submenu) {   
  5.         // Submenu  
  6.     }  
  7.       
  8.     // вместо if (item.getItemId() == 2)  
  9.     if (item.getItemId() == R.id.disable) {   
  10.         isGroupEnabled = !isGroupEnabled;  
  11.         // вместо myMenu.setGroupEnabled(Menu.CATEGORY_SECONDARY, isGroupEnabled);  
  12.         myMenu.setGroupEnabled(R.id.groupSecondary, isGroupEnabled);   
  13.         item.setTitle (isGroupEnabled ? "Disable Items" : "Enable Items");  
  14.     }  
  15.   
  16.     // и т. д.  
  17.     ...   
  18. }  


Исходники:
создание меню в коде
создание меню в xml

Комментариев нет:

Отправить комментарий