В этой статье рассмотрен простейший пример создания меню опций (options menu настроек) для программы Android.
[Краткий обзор средств для создания меню опций]
В приложении Android меню опций (или меню настроек) программы вызывается, если нажать на левую системную кнопку на устройстве. По умолчанию при создании проекта приложения в Eclipse с помощью мастера (File -> New -> Android Application Project) создается простейшее меню опций с единственным пунктом Settings.
При выборе пункта Settings меню ничего не происходит, меню опций просто закрывается. В классе Activity встраивание меню делает процедура onCreateOptionsMenu, которая обычно создается автоматически, когда создается проект приложения.
@OverridepublicbooleanonCreateOptionsMenu(Menu menu){// Встраивание меню; здесь добавляются элементы на плашку// действий (action bar), если она присутствует.
getMenuInflater().inflate(R.menu.main, menu);returntrue;}
В среде Eclipse (ADT) есть удобный встроенный редактор меню, который откроется при двойном щелчке на файле res\menu\main.xml, если перейти на нижнюю вкладку Layout.
Стандартный идентификатор, задающий удобное для человека текстовое имя для ресурса (в данном случае пункта или подпункта) меню. По этому идентификатору обращаются к пункту меню в коде Java (получают доступ к ресурсу меню, см. [3]). Соответствует атрибуту XML android.id.
Menu category
Задает тип меню: CATEGORY_SYSTEM, CATEGORY_SECONDARY, CATEGORY_ALTERNATIVE, CATEGORY_CONTAINER.
Order in category
Задает порядок, в котором этот элемент меню появляется в категории. Соответствует атрибуту XML android:orderInCategory.
Title
Указывает на текстовый ресурс, задающий текст, который будет отображаться на пункте меню. Соответствует атрибуту XML android:title.
Title condensed
Также указывает на текстовый ресурс, но на этот раз сжатого заголовка меню. Используется для случаев, когда основной текст меню слишком велик и не помещается на пункте меню. Соответствует атрибуту XML android:titleCondensed.
Icon
Указывает на drawable-ресурс, картинку, которая будет отображаться в пункте меню. Соответствует атрибуту XML android:icon.
Alphabetic shortcut
Буквенный символ для шортката меню. Соответствует атрибуту XML android:alphabeticShortcut.
Numeric shortcut
Цифра для шортката меню. Соответствует атрибуту XML android:numericShortcut.
Checkable
Если true, то пункт меню имеет галочку, которую можно установить. Изначально атрибут не задан, что означает отсутствие галочки (как и false). Соответствует атрибуту android:checkable.
Checked
Если true, то по умолчанию на пункте меню стоит галочка. Изначально значение атрибута не задано. Соответствует атрибуту android:checked.
Visible
Если true (по умолчанию, если атрибут не задан), то пункт меню отображается. Соответствует атрибуту android:visible.
Enabled
Если true (по умолчанию, если атрибут не задан), то работа пункта меню разрешена. Соответствует атрибуту android:enabled.
On click
Тут можно задать имя метода, который выполнится при выборе этого пункта меню. Этот метод должен быть общедоступен (определен как public), и его код должен находиться в классе Activity приложения, и должен в качестве параметра принимать экземпляр MenuItem (дает ссылку на пункт меню, на котором был сделан клик). Соответствует атрибуту android:onClick.
Show as action
Ключевое слово. Задает, когда и как этот пункт меню должен появиться в Action Bar как пункт, задающий действие. Соответствует атрибуту android:showAsAction.
Action layout
Указывает на ресурс layout, показывающий вид действия. Соответствует атрибуту android:actionLayout.
Avtion view class
Имя класса для View, который используется для представления действия. Соответствует атрибуту android:actionViewClass.
Action provider class
Имя класса для ActionProvider, использующийся вместо элемента действия. Соответствует атрибуту android:actionProviderClass.
[Практический пример создания меню опций]
Предположим, что нужен следующий простейший вариант меню настроек: при выборе пункта меню откроется подменю, в котором будет задаваться номер управляемого реле. Далее процесс создания такого меню по шагам.
1. В среде Eclipse (ADT) создайте новый проект.
......
2. Теперь можно приступить к созданию меню. Двойным щелчком откройте файл res\menu\main.xml, перейдите на нижнюю закладку Layout, чтобы открылся графический редактор меню. Выбор реле можно сделать в виде пунктов подменю (Menu -> SubMenu). Наша цель создать простейшее меню следующего вида:
Выбрать № реле (это единственный пункт главного меню)
Реле 0 (подпункты меню, клик на которых выбирают конкретное управляемое реле)
Реле 1
Реле 2
Реле 3
Реле 4
...
Реле 29
Сначала выберите главный пункт меню action_settings, и установите у него атрибут заголовка:
Title Выбрать № реле
Затем нажмите кнопку Add..., выберите второй вариант "Create new element in the selected element", кликните на Sub-Menu и кликните OK.
Создастся подменю Sub-Menu.
3. Теперь нужно добавить элементы в подменю (Реле 0, Реле 1, ... Реле 29). Слева выберите элемент Sub-Menu, и нажмите кнопку Add..., снова должен быть выбран вариант "Create new element in the selected element", только теперь нужно кликнуть на Item, и кликнуть OK.
Создастся один пункт для подменю Item (с идентификатором item1). Отредактируйте у него следующие свойства:
Id @+id/relay000 Title Реле 0
Сохраните файл. Можно добавить остальные пункты подменю таким же способом, но удобнее сделать это в текстовом редакторе.
4. Переключитесь на нижнюю закладку редактора main.xml. Файл меню отобразится в текстовом редакторе, и будет иметь примерно такой вид:
Пункт подменю закодирован элементом item android:id="@+id/relay000" android:title="Реле 0". Добавьте методом копирования и вставки текста новые пункты подменю, исправив в них значение id и текст заголовка title.
Запустите программу на выполнение, нажав Ctrl+F11, и протестируйте, как работает созданное меню.
Пункты подменю можно прокручивать вверх и вниз, и легко выбирать нужный. Всю работу на себя берет Android API, пока не понадобилось писать ни одной строки кода.
5. Пока наше меню ничего не умеет, кроме того как выводиться и отображаться. Теперь предстоит добавить обработчик клика на пункте подменю, чтобы можно было предпринять программно какое-нибудь действие в ответ на выбор пункта меню. В нашем примере нам нужно просто запомнить номер выбранного реле. Добавьте в определение класса Activity программы следующий метод:
Принцип действия обработчика меню понятен. Оператор switch декодирует, какой пункт меню задействован, и соответственно присваивает переменной relay нужное значение.
Примечание: имейте в виду, что onOptionsItemSelected будет срабатывать на нажатия всех пунктов меню и подменю (в том числе и при входе в главное меню, когда нажмете на пункт "Выбрать № реле". Код в обработчике должен это учитывать, и корректно обрабатывать клики в меню.
Код можно сократить, если декодировать пункты меню без оператора switch, например по содержимому надписи Title.