Меню
Android поддерживает несколько типов меню. Первый — на телефоне есть отдельная кнопка Menu (в старых телефонах), нажатие которой вызывает меню. В новых устройствах отдельную кнопку убрали, заменив на значок меню в виде трёх точек в вертикальной ориентации. Второй тип — контекстное меню, которое появляется при нажатии и удерживания пальца на экране в нужном месте (также можно нажать и удерживать центральную кнопку на телефоне). Контекстное меню в свою очередь может иметь подменю. Сегодня мы познакомимся с первым типом меню. В данной статье будет рассматриваться работа с меню на новых устройствах под управлением Android 4.0 и выше.
В шаблоне Empty Activity нет меню, поэтому мы создадим его сами. Это поможет вам понять принцип работы и получить общее представление о проекте. Запоминать названия классов, методов и код для обработки выбора пунктов меню необязательно. В других шаблонах меню будет встроено и вы можете сразу использовать его.
Создайте новый проект на основе Empty Activity и запустите его. Никакого меню пока нет.
Создадим несколько строковых ресурсов в файле res/values/strings.xml, которые будут отвечать за пункты меню:
Settings Кот Кошка Котёнок
Теперь создайте новую папку menu в папке res (правый щелчок мыши на папке res, | New | Directory). Далее создайте в созданной папке файл menu_main.xml — имя указывает, что меню относится к основной активности MainActivity (правый щелчок мыши на папке menu | New | Menu Resource File). Если вы будете создавать приложение с несколькими экранами, то у каждой активности будет отдельное меню со своими настройками. Пока откроем файл menu_main.xml и добавим в полученный шаблон свой код:
Откроем файл MainActivity. Сейчас в нём только один метод onCreate(). Добавим новый метод onCreateOptionsMenu(). Именно данный метод отвечает за появление меню у активности. Сразу после метода onCreate() начинайте вводить первые символы метода и дальше студия сама покажет список подходящих методов.
Найдите нужный метод и заготовка будет создана автоматически.
override fun onCreateOptionsMenu(menu: Menu?): Boolean
Добавляем в заготовку метод, который берёт данные из ресурсов меню и преобразует их в пункты меню на экране.
override fun onCreateOptionsMenu(menu: Menu?): Boolean
В методе inflate() вы указываете ресурс меню (R.menu.menu_main) и объект класса Menu.
По английски «inflate» переводится как надувать, по замыслу разработчиков Android, мы как бы надуваем данными объект, например, меню.
Ваш браузер устарел. Видео с котом не увидите
По другой версии слово «inflate» происходит от словосочетания in flat — в квартиру. Существует старинная традиция запускать в квартиру первым кота, который исследует все закоулки дома и заявляет о своём согласии жить в нём. Так и мы запускаем данные из XML-файла в объект MenuInflater.
Запустите проект. Теперь в правой части заголовка вы увидите значок из трёх точек, выстроенных в вертикальную линию. Нажмите на значок, чтобы увидеть пункт меню Settings.

Как не трудно догадаться, элемент item отвечает за отдельный пункт меню. Добавим ещё три пункта по такому же принципу, меняя только идентификатор и текст для меню:
Запустите проект и попробуйте снова вызвать меню. Вы увидите три новых пункта.

Параметры id и title не нуждаются в объяснениях. Параметр orderInCategory позволяет задать свой порядок вывода пунктов меню. Предположим вы создали пять пунктов меню, но пока не определились с порядком их вывода на экране. Чтобы не перемещать постоянно целые блоки кода для пунктов меню в нужном порядке, можно воспользоваться данным параметром.
И, наконец, важный атрибут app:showAsAction определяет поведение меню в ActionBar. Значение never означает, что элемент меню не должен выводиться в заголовке, а только в всплывающем меню, т.е. находиться за тремя точками. Если вы установите значение always, то пункт Settings сразу появится в заголовке вашего приложения. Также доступны значения ifRooms, withText и collapseActionView. Попробуйте самостоятельно. Например, ifRoom выводит пункт меню, если позволяет место. Если пунктов будет много, то они будут только мешаться. Как правило, в таком варианте выводят очень короткое слово или значок для частых операций, чтобы избежать лишнего щелчка на три точки.
Обратите внимание на атрибут app:showAsAction, который относится к пространству имён xmlns:app=»http://schemas.android.com/apk/res-auto». Было время, когда такого пространства имён не существовало и в проектах использовался атрибут android:showAsAction из стандартного пространства имён. Если студия будет ругаться на ошибку, то отредактируйте код.
Пока пункты меню не выполняют полезной работы. Любое нажатие на пункт просто закрывает меню без видимых последствий. Мы ещё не написали код для обработки нажатий.
Выбор пунктов меню
Мы научились создавать меню. Но пока оно бесполезно, так как пункты меню никак не реагируют на наши нажатия. Для обработки нажатий пунктов меню служит другой метод onOptionsItemSelected(). Добавим метод по такому же принципу, как для предыдущего примера. Получим заготовку.
override fun onOptionsItemSelected(item: MenuItem): Boolean
Параметр item отвечает за пункт меню. Вам следует получить идентификатор меню через метод getItemId() и указать для него код (в Kotlin вместо метода используется свойство itemId). Так как обычно меню состоит из нескольких пунктов, то удобно использовать конструкцию when. Для вывода информации воспользуемся текстовой меткой. Добавьте на экран активности компонент TextView. Можете использовать имеющийся TextView с надписью «Hello World!», только присвойте ему идентификатор.
Добавим код в заготовку для выбранного пункта меню:
override fun onOptionsItemSelected(item: MenuItem): Boolean < when (item.itemId) < R.id.action_cat1 -> < textView.text = "Вы выбрали кота!" return true >R.id.action_cat2 -> < textView.text = "Вы выбрали кошку!" return true >R.id.action_cat3 -> < textView.text = "Вы выбрали котёнка!" return true >> return super.onOptionsItemSelected(item) >
Запустите приложение, вызовите меню и выберите любой пункт меню. В текстовом поле должно появиться сообщение.

Переключатели
Внешний вид пунктов меню можно изменить на вид с переключателями. Для этого нужно добавить элемент group с атрибутом android:checkableBehavior=»single»:

Большого смысла в этом режиме я не вижу. И рассматривать его не будем.
Режим Design
В Android Studio 2.2 добавили графический режим построения меню, которых похож на панель инструментов для добавления новых компонентов на экран. У меню панель состоит из четырёх элементов: Menu Item, Search Item, Menu, Group.

Принцип тот же, выбираете нужный элемент и перетаскиваете его на экран в область меню. Если вы изучили ручное создание меню, то данный способ не вызовет у вас затруднений. С его помощью можно быстро набросать структуру меню, а затем подправить вручную.
Итак, вы получили базовые навыки работы с меню, достаточных для большинства случаев. Если хотите узнать больше, то почитайте дополнительную информацию о меню в разделе Теория.
Пример на Java
Код на Java не сильно отличается. Создание элементов меню на XML остаётся без изменений. Осталось только написать кода в классе активности.
Выберите в студии меню Code | Override Methods. и в следующим окне начинайте вводить название метода по первым буквам. Можно вводить по первым заглавным буквам, т.е. ocom (onCreateOptionsMenu), чтобы быстро найти нужную строку. Нажимаем кнопку OK и получаем заготовку.

@Override public boolean onCreateOptionsMenu(Menu menu)
Добавляем в заготовку метод, который берёт данные из ресурсов меню и преобразует их в пункты меню на экране.
@Override public boolean onCreateOptionsMenu(Menu menu)
@Override public boolean onOptionsItemSelected(MenuItem item)
Добавим код в заготовку для выбранного пункта меню:
@Override public boolean onOptionsItemSelected(MenuItem item) < // получим идентификатор выбранного пункта меню int TextView infoTextView = findViewById(R.id.textView); // Операции для выбранного пункта меню switch (id) < case R.id.action_cat1: infoTextView.setText("Вы выбрали кота!"); return true; case R.id.action_cat2: infoTextView.setText("Вы выбрали кошку!"); return true; case R.id.action_cat3: infoTextView.setText("Вы выбрали котёнка!"); return true; default: return super.onOptionsItemSelected(item); >>
Запустите приложение, вызовите меню и выберите любой пункт меню. В текстовом поле должно появиться сообщение.
Существует альтернативный способ через XML, похожий на обработку щелчков кнопки (начиная с Android 3.0). Вы можете добавить атрибут android:onClick в ресурсах меню, и вам не нужно использовать вызов метода onOptionsItemSelected(). При помощи android:onClick вы можете указать нужный метод при выборе пункта меню. Добавьте данный атрибут к пункту Settings
Теперь в коде активности напишем следующее:
// у атрибута пункта меню Settings установлено значение android:onClick="onSettingsMenuClick" public void onSettingsMenuClick(MenuItem item)
Создание меню для приложения

Сегодня мы расскажем: как сделать нижнее меню для приложения.
В этом нам помогут Android Studio и Java.
У Google для создания меню предусмотрена своя библиотека. Для её добавления в проект достаточно в Gradle приложения, в объект dependencies прописываем две строки:
implementation ‘com.android.support:appcompat-v7:26.1.0’
implementation ‘com.android.support:design:26.1.0’
После нажимаем Sync Now и ждем несколько секунд.
Теперь мы можем использовать BottomNavigationView (Компонент самого меню)
Далее в папке res создаем папку menu (new->Android Resources Directory), а в строке Directory Name и Resources Type указываем menu. В данной папке мы будем хранить файлы с кнопками, которые будут отображаться в меню.
Создание экземпляра меню
После создания папки menu нам нужно создать сам файл, в котором будут храниться кнопки для меню.
Кликаем ПКМ по папке menu и создаём Menu Resources (new->Menu Resources), даем название файлу.
Открываем этот файл, выбираем режим редактирования Code. Для создания кнопки существует тэг item. В случае, если мы делаем кнопки для меню, то он принимает два обязательных параметра: icon и title.
В параметр icon мы вставляем ссылку на картинку, которую хотим отображать в меню.
В параметр title указываем название, которое будет отображаться под кнопкой.
Также рекомендуем добавить тэг id, чтобы в будущем вы могли отслеживать нажатие кнопок.
Мы создали три кнопки и получился такой код:
android:title =»Вкладка 1″ />
Урок 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 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.


