Как сделать menu в android studio
В этой статье рассмотрен простейший пример создания меню опций (options menu настроек) для программы Android.
[Краткий обзор средств для создания меню опций]
В приложении Android меню опций (или меню настроек) программы вызывается, если нажать на левую системную кнопку на устройстве. По умолчанию при создании проекта приложения в Eclipse с помощью мастера (File -> New -> Android Application Project) создается простейшее меню опций с единственным пунктом Settings.

При выборе пункта Settings меню ничего не происходит, меню опций просто закрывается. В классе Activity встраивание меню делает процедура onCreateOptionsMenu, которая обычно создается автоматически, когда создается проект приложения.
@Override public boolean onCreateOptionsMenu(Menu menu) // Встраивание меню; здесь добавляются элементы на плашку // действий (action bar), если она присутствует. getMenuInflater().inflate(R.menu.main, menu); return true; >
В среде Eclipse (ADT) есть удобный встроенный редактор меню, который откроется при двойном щелчке на файле res\menu\main.xml , если перейти на нижнюю вкладку Layout.

| Имя свойства | Описание |
| Id | Стандартный идентификатор, задающий удобное для человека текстовое имя для ресурса (в данном случае пункта или подпункта) меню. По этому идентификатору обращаются к пункту меню в коде 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. Файл меню отобразится в текстовом редакторе, и будет иметь примерно такой вид:
< menuxmlns:android="http://schemas.android.com/apk/res/android" > < itemandroid:id="@+id/action_settings" android:orderInCategory="100" android:showAsAction="never" android:title="@string/action_settings" > < itemandroid:id="@+id/relay000" android:title="Реле 0"/ > < /menu > < /item > < /menu >
Пункт подменю закодирован элементом item android:id=»@+id/relay000″ android:title=»Реле 0″. Добавьте методом копирования и вставки текста новые пункты подменю, исправив в них значение id и текст заголовка title.
Запустите программу на выполнение, нажав Ctrl+F11, и протестируйте, как работает созданное меню.
![]() |
![]() |
Пункты подменю можно прокручивать вверх и вниз, и легко выбирать нужный. Всю работу на себя берет Android API, пока не понадобилось писать ни одной строки кода.
5. Пока наше меню ничего не умеет, кроме того как выводиться и отображаться. Теперь предстоит добавить обработчик клика на пункте подменю, чтобы можно было предпринять программно какое-нибудь действие в ответ на выбор пункта меню. В нашем примере нам нужно просто запомнить номер выбранного реле. Добавьте в определение класса Activity программы следующий метод:
@Override public boolean onOptionsItemSelected(MenuItem item) textDebug.append(item.getTitle()); // Обработка выбора пункта подменю. switch (item.getItemId()) case R.id.relay000: relay = 0; return true; case R.id.relay001: relay = 1; return true; . case R.id.relay029: relay = 29; return true; default: return super.onOptionsItemSelected(item); > >
Принцип действия обработчика меню понятен. Оператор switch декодирует, какой пункт меню задействован, и соответственно присваивает переменной relay нужное значение.
Примечание: имейте в виду, что onOptionsItemSelected будет срабатывать на нажатия всех пунктов меню и подменю (в том числе и при входе в главное меню, когда нажмете на пункт «Выбрать № реле». Код в обработчике должен это учитывать, и корректно обрабатывать клики в меню.
Код можно сократить, если декодировать пункты меню без оператора switch, например по содержимому надписи Title.
@Override public boolean onOptionsItemSelected(MenuItem item) String title = item.getTitle().toString(); String[] separated = title.split(" "); if (separated[0].equals("Реле") && (2==separated.length)) relay = Integer.parseInt(separated[1]); > return true; >
[Ссылки]
1. Menus site:developer.android.com .
2. Menu Resource site:developer.android.com .
3. Получение доступа к ресурсам приложения Android.
Меню
Меню в приложениях представляет класс android.view.Menu , и каждая activity ассоциируется с объектом этого типа. Объект android.view.Menu может включать различное количество элементов, а те в свою очередь могут хранить подэлементы.
Определение меню в xml
Меню, как и файлы интерфейса или изображений, также представляет собой ресурс. Однако при создании нового проекта с Empty Activity по умолчанию нет никаких ресурсов меню, поэтому при необходимости их нужно добавлять вручную. Так, для определения ресурсов меню в проекте нажмем правой кнопкой мыши в проекте на каталог res и далее в открывшемся списоке выберем пункт New -> Android Resource File :

Далее в появившемся окне укажем для имени файла название main_menu , а для поля Resource Type (тип ресурса) выберем Menu :

После этого в каталоге res будет создан подкаталог menu, в котором будет находиться файл main_menu.xml .

По умолчанию этот файл определяет один пустой элемент menu:
Изменим содержимое файла, определив несколько пунктов:
Тег является корневым узлом файла и определяет меню, состоящее из одного или нескольких элементов и .
Элемент представляет объект MenuItem, которой является одним из элементов меню. Этот элемент может содержать внутренний подэлемент , с помощью которого создается подменю.
Элемент включает следующие атрибуты, которые определяют его внешний вид и поведение:
- android:id : уникальный id элемента меню, который позволяет его опознать при выборе пользователем и найти через поиск ресурса по id
- android:icon : ссылка на ресурс drawable, который задает изображение для элемента ( android:icon=»@drawable/ic_help» )
- android:title : ссылка на ресурс строки, содержащий заголовок элемента. По умолчанию имеет значение «Settings»
- android:orderInCategory : порядок следования элемента в меню
Наполнение меню элементами
Мы определили меню с тремя элементами, но само определение элементов в файле еще не создает меню. Это всего лишь декларативное описание. Чтобы вывести его на экран, нам надо использовать его в классе Activity. Для этого надо переопределить метод onCreateOptionsMenu . Итак, перейдем к классу MainActivity и изменим его следующим образом:
package com.example.menuapp; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.Menu; public class MainActivity extends AppCompatActivity < @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); >@Override public boolean onCreateOptionsMenu(Menu menu) < getMenuInflater().inflate(R.menu.main_menu, menu); return true; >>
Метод getMenuInflater возвращает объект MenuInflater , у которого вызывается метод inflate() . Этот метод в качестве первого параметра принимает ресурс, представляющий наше декларативное описание меню в xml, и наполняет им объект menu, переданный в качестве второго параметра.
Запустим приложение по умолчанию и нажмем на кнопку меню в правом верхнем углу:

Обработка нажатий в меню
Если мы нажмем на любой из пунктов меню, то ничего не произойдет. Чтобы привязать к меню действия, нам надо переопределить в классе activity onOptionsItemSelected .
Для вывода выбранного элемена меню в файле activity_main.xml определим текстовое поле с >
И изменим класс MainActivity:
package com.example.menuapp; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.widget.TextView; public class MainActivity extends AppCompatActivity < @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); >@Override public boolean onCreateOptionsMenu(Menu menu) < getMenuInflater().inflate(R.menu.main_menu, menu); return true; >@Override public boolean onOptionsItemSelected(MenuItem item) < int TextView headerView = findViewById(R.id.selectedMenuItem); switch(id)< case R.id.action_settings : headerView.setText("Настройки"); return true; case R.id.open_settings: headerView.setText("Открыть"); return true; case R.id.save_settings: headerView.setText("Сохранить"); return true; >//headerView.setText(item.getTitle()); return super.onOptionsItemSelected(item); > >
Чтобы понять, какой пункт меню выбран, вначале получаем его идентификатор int >. Затем пробегаемся в конструкции switch..case и выбираем нужный вариант и в зависимости от выбора производим определенные действия — в данном случае устанавливаем текст TextView.

Стоит отметить, что в данном случае, если наша задача заключалась, чтобы просто в выводе текста выбранного пункта меню, то мы вместо конструкции switch просто могли написать так:
headerView.setText(item.getTitle());
Программное создание меню
Кроме определения элементов меню в xml, можно также создать меню программным способом. Для добавления новых пунктов меню используется метод add() класса Menu .
Например, изменим код MainActivity :
package com.example.menuapp; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.widget.TextView; public class MainActivity extends AppCompatActivity < @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); >@Override public boolean onCreateOptionsMenu(Menu menu) < super.onCreateOptionsMenu(menu); menu.add("Настройки"); menu.add("Открыть"); menu.add("Сохранить"); return true; >@Override public boolean onOptionsItemSelected(MenuItem item) < String title = item.getTitle().toString(); TextView headerView = findViewById(R.id.selectedMenuItem); headerView.setText(title); return super.onOptionsItemSelected(item); >>
Использованная версия метода add() принимает заголовок для пункта меню.
Урок 13. Создание простого меню
Что такое меню, думаю, нет смысла рассказывать. Оно отображается при нажатии кнопки Menu. Давайте создадим свое.
11.12.2017 Кнопки меню обычно уже нет на современных устройствах. Меню переехало в ActionBar.
Подробнее об этом можно прочитать в Уроке 107. Некоторые скриншоты там устарели, но код и общий смысл актуальны.
Project name: P0131_MenuSimple
Build Target: Android 2.3.3
Application name: MenuSimple
Package name: ru.startandroid.develop.menusimple
Create Activity: MainActivity
Откроем MainActivity.java. За создание меню отвечает метод onCreateOptionsMenu. На вход ему подается объект типа Menu, в который мы и будем добавлять свои пункты.
Добавьте в Activity этот метод:
public boolean onCreateOptionsMenu(Menu menu) < // TODO Auto-generated method stub menu.add("menu1"); menu.add("menu2"); menu.add("menu3"); menu.add("menu4"); return super.onCreateOptionsMenu(menu); >
Пункты меню добавляются методом add. На вход методу подается текст пункта меню. Добавим 4 пункта.
Метод onCreateOptionsMenu должен вернуть результат типа boolean. True – меню показывать, False – не показывать. Т.е. можно было бы накодить проверку какого-либо условия, и по итогам этой проверки не показывать меню передавая False. Пока нам это не нужно, поэтому поручаем этот выбор методу суперкласса, по умолчанию он возвращает True.
Сохраним все, запустим приложение и нажмем кнопку меню на эмуляторе.

Появилось 4 пункта меню. Нажатие на них ни к чему не приводит, т.к. не реализован обработчик. Обработчиком является Activity, а метод зовется onOptionsItemSelected. На вход ему передается пункт меню, который был нажат – MenuItem. Определить, какое именно меню было нажато можно по методу getTitle. Давайте выводить всплывающее сообщение с текстом нажатого пункта меню. На выходе метода надо возвращать boolean. И мы снова предоставляем это суперклассу.
public boolean onOptionsItemSelected(MenuItem item) < // TODO Auto-generated method stub Toast.makeText(this, item.getTitle(), Toast.LENGTH_SHORT).show(); return super.onOptionsItemSelected(item); >
Полный код:
public class MainActivity extends Activity < /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.main); >@Override public boolean onCreateOptionsMenu(Menu menu) < // TODO Auto-generated method stub menu.add("menu1"); menu.add("menu2"); menu.add("menu3"); menu.add("menu4"); return super.onCreateOptionsMenu(menu); >@Override public boolean onOptionsItemSelected(MenuItem item) < // TODO Auto-generated method stub Toast.makeText(this, item.getTitle(), Toast.LENGTH_SHORT).show(); return super.onOptionsItemSelected(item); >>
Определять нажатый пункт меню по тексту – это не самый лучший вариант. Далее будем делать это по ID. Но для этого надо немного по другому создавать меню.
На следующем уроке:
— создаем пункты меню с ID
— группируем и сортируем пункты меню
Присоединяйтесь к нам в Telegram:
— в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.
— в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Compose, Kotlin, RxJava, Dagger, Тестирование, Performance
— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня
Меню в Android приложениях
Android поддерживает два типа меню : главное и контекстное (других пока не придумано). В старых телефонах имеется отдельная кнопка Menu, нажатие которой открывает главное меню. Начиная с версии Android 3.0 (уровень API 11) наличие отдельной кнопки Меню больше не требуется; Android приложения перестали зависеть от традиционной панели меню из 6 пунктов. Вместо нее в приложениях появилась строка действий ActionBar с часто используемыми действиями пользователя. Несмотря на то, что интерфейс и поведение некоторых пунктов меню изменились, бизнес-логика определения набора действий по-прежнему основана на API-интерфейсах класса Menu. Таким образом, начиная с версии Android 3.0 пункты меню размещаются в строке действий ActionBar в виде сочетания отображаемых на экране вариантов действий и иконки из трёх вертикальных точек, которую расположили в правой верхней части приложения. При нажатии на иконку открывается отдельное окно, в котором вертикально отображается список дополнительных вариантов выбора.
Контекстное меню появляется при длительном нажатии пальцем на каком-либо элементе интерфейса приложения. В контекстном меню содержатся действия, которые затрагивают выбранный контент или контекстный кадр. Пункты контекстных действий, затрагивающие выбранный контент, располагаются в строке в верхней части экрана.
В данной статье рассмотрим пример использования первого типа меню (на новых устройствах) под управлением Android 4.0 и выше. К пунктам меню добавим иконки. При этом, один из пунктов меню с иконкой тележки (ic_shopping_cart_black.png) сделаем видимым, а остальные скрытыми. Для этого создадим новый модуль/проект p06menu, интерфейс которого представлен на следующем скриншоте. В верхней части приложения располагается меню, в нижней части высвечивается всплывающее сообщение, создаваемое классом Toast при выборе какого-либо пункта меню. То есть, в примере можно будет выбрать какой-либо пункт меню и увидеть связанное с ним сообщение.

Определение интерфейса
В интерфейсе приложения (activity_main.xml) создаваемый по умолчанию компонент TextView с текстом «Hello World» удаляем. После этого подключаем панель инструментов. Для этого в панели Palette (нижний скриншот) открываем вкладку Containers и перетаскиваем в панель Component Tree компонент AppBarLayout. Компонент Toolbar будет добавлен автоматически.

Исходный текст файла конфигурации интерфейса activity_main.xml можно подкорректировать так, чтобы он выглядел следующим образом :
Листинг activity_main.xml
Иконки пунктов меню
Прежде чем формировать меню, загрузим в директорию модуля res/drawable следующие иконки (более 6) :

Для этого можно использовать Ctrl+C, Ctrl+V. Копирование изображений в проект подробно рассмотрено здесь.
Создание меню
В примере будем использовать ресурсный файл меню, т.е. для описания меню будет использоваться XML файл, располагаемый в директории проекта res/menu/. Для формирования ресурсного XML файла описания меню выбираем в Studio New/Android Resource File, и, в открывшемся окне, определяем наименование «main_menu». Нажимаем OK, и в директории res/menu/ будет создан файл main_menu.xml.

Описание меню включает следующие секции :
- корневой элемент в XML-структуре файла; может содержать один или несколько элементов и ;
- непосредственный пункт меню; элемент может иметь вложенный элемент для создания подменю;
- невидимый контейнер для пунктов меню; позволяет выполнять группирование элементов (необязательная секция).
В следующем листинге файла main_menu.xml представлены 2 первых пункта меню нашего примера. Пункт меню с тележкой (Cart) определяем постоянно видимым (app:showAsAction=»always»), а пункт меню Call – невидимым (app:showAsAction=»never»); он будет доступен при открытии главного меню.
Каждый пункт меню включает следующие атрибуты :
• id идентификатор пункта меню, по которому приложение может распознать выделенный пользователем пункт меню;
• title отображаемый текст;
• icon отображаемый рядом с текстом иконка;
• showAsAction определяет поведение меню в ActionBar;
• enabled определение доступности пункта меню (не используется в примере);
• orderInCategory порядок отображения в ActionBar (не используется в примере);
• titleCondensed атрибут применяется в том случае, если обычный заголовок слишком широкий и не «помещается» в выбранном элементе меню (не используется в примере).
Важный атрибут app:showAsAction определяет поведение меню в ActionBar. Значение never означает, что элемент меню не должен выводиться в заголовке ActionBar, а только во всплывающем меню. Если установить значение always, то пункт меню будет представлен в заголовке приложения (ActionBar). Также доступны значения ifRooms (если позволяет место), withText и collapseActionView.
Конечно же, следовало бы локализовать меню в примере. Для этого необходимо определить наименования пунктов меню в ресурсном файле res/values/strings.xml и подключить их в опциях android:title пунктов меню. Но для данного примера, где рассматривается меню, локализация пунктов меню не имеет значения.
Группирование пунктов меню
Группирование пунктов меню осуществляется с использованием секции . В секции можно объединить несколько пунктов меню, дополнив их переключателями. Добавим элемент group с атрибутом android:checkableBehavior=»single» для двух других пунктов меню Camera и Video, как это представлено в следующем листинге. Такой тип группировки определяет возможность выбора/выделения одного из двух пунктов меню, подобно кнопкам типа Radio.
Атрибут checkableBehavior может иметь одно из трех следующих значений :
• single только один пункт из группы можно пометить (переключатель);
• all все пункты группы можно пометить (флажки);
• none нельзя ни один пункт из группы пометить.
Интерфейс меню
Среда разработки Android Studio представляет описание файла меню main_menu.xml в двух режимах ( Design | Text ) подобно описанию интерфейса activity_main.xml. На следующем скриншоте main_menu.xml представлен в режиме Design. В графическом интерфейсе файла main_menu.xml изображены все пункты меню. При этом в заголовке ActionBar располагается первый пункт меню с изображением тележки, рядом с которой располагается иконка с вертикальным изображением трех точек. При нажатии на эту иконку в режиме run-time будет открыто (представленное на скриншоте) вертикально расположенное в ActionBar меню.

В панели Component Tree представлена иерархическая структура меню. Рядом с каждым пунктом меню располагается иконка с предупреждением о необходимости локализации текста, о чем было сказано выше.
Поскольку в меню используются иконки, то необходимо внести изменения в файл проекта res/values/styles.xml и в файл студии Gradle Scripts/p06menu.
Листинг res/values/styles.xml
Внесенные в файл изменения выделены жирным стилем.
Листинг Gradle Scripts/p06menu
В директории Gradle Scripts располагаются некоторые файлы модулей. Для того, чтобы в меню наряду с текстом отображались иконки необходимо в файл Gradle Scripts/p06menu примера добавить строку.

В следующем листинге представлен текст файла Gradle Scripts/p06menu. Последняя выделенная строка необходима, чтобы в пунктах меню можно было использовать иконки. Согласуйте номер со своей версией SDK.
apply plugin: 'com.android.application' android < compileSdkVersion 28 defaultConfig < applicationId "com.android.test.p06menu" minSdkVersion 26 targetSdkVersion 28 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" >buildTypes < release < minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' >> > dependencies < implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'com.android.support:appcompat-v7:28.0.0' implementation 'com.android.support.constraint:constraint-layout:1.1.3' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' compile 'com.android.support:design:28.0.0-alpha1' >
Обработчики событий
Для того, чтобы приложение как-то реагировало на выбор пункта меню, необходимо к нему подключить соответствующий обработчик. Это можно сделать двумя способами. Первый, самый простой, связан с созданием метода в активности MainActivity.java и подключение его в файле описания пункта меню. Подключим подобный обработчик события к пункту меню Help. Для этого в модуль MainActivity.java включим метод onHelpClick. Обратите внимание на описание метода : он должен быть public и принимать параметр типа MenuItem. Метод выводит сообщение с использованием класса Toast.
public void onHelpClick(MenuItem item)
Для подключения к пункту меню метода обработки сообытия необходимо в атрибуте описания пункта меню android:onClick определить его наименование.
Второй способ подключения обработчиков к пунктам меню связан с методом onOptionsItemSelected. Активность MainActivity.java включает данный метод, но он пустой. Необходимо его переписать. Ниже представлен листинг метода нашего примера, в котором в зависимости от выбранного пункта меню выводится соответствующее сообщение. В качестве параметра метод принимает объект типа MenuItem.
@Override public boolean onOptionsItemSelected(MenuItem item) < String msg = ""; switch (item.getItemId()) < case R.id.CART: msg = "Cart clicked"; break; case R.id.CALL: msg = "Call clicked"; break; case R.id.CAMERA: item.setChecked(true); msg = "Camera clicked"; break; case R.id.VIDEO: item.setChecked(true); msg = "Video clicked"; break; case R.id.EMAIL: msg = "Email clicked"; break; case R.id.ADD: msg = "Add clicked"; break; case R.id.COPY: msg = "Copy clicked"; break; case R.id.PASTE: msg = "Paste clicked"; break; default: super.onOptionsItemSelected(item); >Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_LONG).show(); return true; >
Подключение меню
MainActivity.java может иметь только одно меню. Если приложение имеет несколько экранов, то у каждой активности должно быть отдельное меню со своими настройками. Для подключения меню к активности необходимо переписать метод активности onCreateOptionsMenu. В следующем листинге представлен код активности с двумя методами onCreate и onCreateOptionsMenu (представленные выше методы не включены в листинг). В первом методе создается активность, во втором методе к активности подключается меню. Метод onCreateOptionsMenu вызывается активностью один только раз при первом открытии меню. Но, поскольку, один из пунктов меню (Cart) видимый, то метод вызывается сразу же, при формировании интерфейса приложения.
public class MainActivity extends AppCompatActivity < Toolbar toolbar; @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); toolbar = (Toolbar)findViewById(R.id.toolbar); toolbar.setTitle("p06menu"); toolbar.setTitleTextColor(Color.CYAN); setSupportActionBar(toolbar); >@Override public boolean onCreateOptionsMenu(Menu menu) < MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.main_menu, menu); if(menu.getClass().getSimpleName() .equals("MenuBuilder"))< try< Method m = menu.getClass() .getDeclaredMethod ( "setOptionalIconsVisible", Boolean.TYPE); m.setAccessible(true); m.invoke(menu, true); >catch(NoSuchMethodException e) < System.err.println("onCreateOptionsMenu"); >catch(Exception e) < throw new RuntimeException(e); >> return true; > >
В методе onCreateOptionsMenu сначала создается объект типа MenuInflater. После этого вызывается метод этого объекта inflate, которому в качестве параметров передаются ресурсное меню (R.menu.menu_main) и объект класса Menu. Если объект menu имеет тип MenuBuilder, используется рефлексия, чтобы вызвать метод объекта setOptionalIconsVisible.
Примечание : Android Studio предупреждает, что рефлексия не поддерживается системой и в будущем может не работать (в примере с текущей версией системы работает).
Код с рефлексией, используемый для включения в пункты меню иконок, можно было бы заменить кодом, представленным ниже.
if (menu instanceof MenuBuilder)
Но, к сожалению, я не смог сразу же заставить этот код работать : здесь Android Studio ругалась на метод setOptionalIconsVisible, который в примере был вызван с использованием рефлексии. Полагаю, что как только эта проблема будет решена, то в статью будут внесены соответствующие изменения и данные строки Вы не увидите.
После старта примера Вы должны увидеть интерфейс приложения, представленный на следующем скриншоте. Здесь меню открыто. На первом скриншоте интерфейса приложения отображено сообщение и меню свернуто.

Скачать пример
Используемые в примере файлы описания меню и графического интерфейса, изображения и описание активности MainActivity.java можно скачать здесь (11.4 Kб).

