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()
. Именно данный метод отвечает за появление меню у активности. Выберите в студии меню Code
| и в следующим окне начинайте вводить название метода по первым буквам. Можно вводить по первым заглавным буквам, т.е. ocom (o
nC
reateO
ptionsM
enu), чтобы быстро найти нужную строку. Нажимаем кнопку OK
и получаем заготовку.
@Override
public boolean onCreateOptionsMenu(Menu menu) {
return super.onCreateOptionsMenu(menu);
}
Добавляем в заготовку метод, который берёт данные из ресурсов меню и преобразует их в пункты меню на экране.
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
В методе 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
public boolean onOptionsItemSelected(MenuItem item) {
return super.onOptionsItemSelected(item);
}
Параметр item
отвечает за пункт меню. Вам следует получить идентификатор меню через метод getItemId()
и указать для него код. Так как обычно меню состоит из нескольких пунктов, то удобно использовать конструкции if/else
или switch
. Для вывода информации воспользуемся текстовой меткой. Добавьте на экран активности компонент TextView
. Можете использовать имеющийся TextView
с надписью "Hello World!", только присвойте ему идентификатор.
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"/>
Добавим код в заготовку для выбранного пункта меню:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// получим идентификатор выбранного пункта меню
int id = item.getItemId();
TextView infoTextView = (TextView) 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) {
TextView infoTextView = (TextView) findViewById(R.id.textView);
infoTextView.setText("Вы выбрали пункт Settings, лучше бы выбрали кота");
}
Переключатели
Внешний вид пунктов меню можно изменить на вид с переключателями. Для этого нужно добавить элемент group
с атрибутом android:checkableBehavior="single"
:
Большого смысла в этом режиме я не вижу. И рассматривать его не будем.
Режим Design
В Android Studio 2.2 добавили графический режим построения меню, которых похож на панель инструментов для добавления новых компонентов на экран. У меню панель состоит из четырёх элементов: Menu Item
, Search Item
, Menu
, Group
.
Принцип тот же, выбираете нужный элемент и перетаскиваете его на экран в область меню. Если вы изучили ручное создание меню, то данный способ не вызовет у вас затруднений. С его помощью можно быстро набросать структуру меню, а затем подправить вручную.
Когда то давно, лет 5 назад стремительно набирали популярность аппараты с операционной системой Android. Хорошее было время, мир выходил из кризиса, впереди было много интересного и на каждом аппарате была кнопка Меню.
Спустя 2 года парни из Android сообщили о том, что кнопка "меню" на корпусе аппарата теперь уже не модно и можно без неё. С тех пор каждый из нас (Гильдии разработчиков) знает, как вызвать меню на подавляющем большинстве андроид девайсов.
Кому то это покажется страшным баяном, пусть так, но на прошлой неделе мы потратили 2 часа своей жизни на то, чтобы это объяснить пользователю. Мириться с этим было нельзя, поэтому ниже привожу описание того, как вызвать функцию меню на андроид аппаратах.
Вот так выглядят механические кнопки меню на большинстве распространённых устройств:
Причём в большинстве случаев для вызова функции меню достаточно одного короткого касания.
Однако, часто вызов меню может быть добавлен к кнопке выбора запущенных приложений. Выглядит она так:
В этом случае меню откроется только при долгом нажатии
(так называемый лонг-клик)! То есть не просто ткнули пальцем, а ткнули и подержали
. Многие говорят после этого Вау!
Владельцам планшетов советую обратить внимание на рабочую область экрана, именно там чаще всего находятся кнопки, в том числе и Меню.
Причём не всегда максимально справа, но выглядит эта кнопка именно так.
На свежих версиях Android OS кнопка меню выглядит так.
При длительном нажатии на кнопку питания смартфона или планшета мы, как правило, вызываем меню выключения с двумя опциями: «Выключить» и «Перезагрузить». По большому счету обычному пользователю этого вполне достаточно, и менять что-либо он не будет. Другое дело – продвинутые пользователи, которые не понаслышке знают, что такое Recovery Mode, Bootloader, «мягкая перезагрузка» и были бы не против расширить скудное меню этими функциями. В статье мы расскажем, как это сделать.
Что можно добавить в меню выключения Android
Стоит понимать, что системное меню выключения на Android является элементом пользовательского интерфейса, которое также поддается видоизменениям. В принципе, сюда можно добавлять практически любые параметры. Чаще всего, это различные варианты перезагрузки устройства, звуковые профили и другие системные настройки.
Опытные пользователи мобильных устройств на Android хоть раз в своей жизни перепрошивали свои гаджеты. При этом очень часто они используют специальный режим загрузки Android – Recovery Mode. Он позволяет не только прошить аппарат, но и сделать полный сброс системы до заводских настроек, создать резервную копию, очистить память телефона, получить ROOT и многое другое. Для входа в этот режим обычно используются комбинации нажатий кнопок устройства. Причем для каждой марки смартфона или планшета они могут быть разными. Чтобы не задаваться этим вопросом и каждый раз не нажимать обозначенные кнопки, этот параметр можно добавить в меню выключения.
Мы рассмотрим несколько вариантов изменения системного меню выключения с помощью модуля для Xposed и приложений Material Power Menu и Quick Reboot. Для корректной работы все они требуют наличия на устройстве .
Внимание!
Действия, описанные в этой статье, вы совершаете на свой страх и риск. Если вы не совсем понимаете, зачем вам это нужно, лучше ничего не делайте. Редакция сайта Трешбокс не несет ответственности за «окирпичивание» ваших устройств.
Модуль Advanced Power Menu для Xposed
Преимуществом данного способа является то, что все изменения интегрируются непосредственно в системное меню выключения Android. Для изменения параметров выключения устройства вам понадобится специальная среда выполнения . Откройте приложение , перейдите в репозиторий и найдите там
Advanced Power Menu (APM+)
. Установите модуль и не забудьте активировать его в настройках Xposed. Перезагрузите устройство.
APM+ очень прост в использовании. При первом запуске вы увидите пункты системного меню выключения. Здесь можно удалять имеющиеся пункты, создавать новые и менять их расположение путем перетаскивания. Для некоторых опций утилита позволяет настраивать расширенные параметры в пределах каждого пункта меню. Например, по нажатию на «Перезагрузить» система предложит выбрать тип перезагрузки: обычная, «мягкая», Recovery Mode и Bootloader.
С помощью APM+ можно добавить в меню фонарик, Wi-Fi, звуковые профили, режимы мобильной сети, передачу данных, скриншот, быстрый набор номера и запись экрана. В дополнение к этому внешний вид самого меню также можно незначительно украсить, применив одну из тем оформления.
Но наиболее полезной особенностью модуля APM+ являются «противоугонные» функции. Они позволяют отключить некоторые элементы меню или защитить их паролем, добавить текстовое предупреждение на экране блокировки и прочее. Также интересным выглядит возможность создать фальшивый пункт «Выключить», который имитирует выключение устройства, а на самом деле выполняет другие, отмеченные пользователем в настройках, действия.
Advanced Power Menu лучше всего подходит для устройств со стоковым Android 4.0 и выше. На многих фирменных оболочках модуль не работает, разработчиком заявлена поддержка только Xperia UI и TouchWiz. Сейчас, по всей видимости, работа над модулем приостановлена. Утилита уже более года как не получала обновление, а ее последняя версия лишь частично поддерживает Android 6.0. Тем не менее, если у вас есть аппарат на KitKat или Lollipop – можете попробовать поставить на него APM+.
Как известно, Android KitKat содержит более расширенное меню выключения, нежели Lollipop и Marshmallow. В нем, кроме пунктов «Выключить» и «Перезагрузить» есть еще «Режим полета» и звуковые профили. Приложение Material Power Menu возвращает их в меню на устройствах с Android 5.0 и выше. В качестве бонуса утилита содержит опции для входа в режим загрузчика и восстановления, а также «мягкую» перезагрузку, при которой перезапускается только интерфейс системы. Еще одной интересной функцией программы является Safe Mode (безопасный режим). В этом режиме, по аналогии с компьютером, система Android загружается с отключенными сторонними приложениями. Если вы, например, подхватили какой-нибудь троян или другой зловред, можно использовать Safe Mode для его удаления из системы.
Material Power Menu работает независимо от механической кнопки питания устройства. Для удобства вызова меню выключения можно вынести ярлык приложения на рабочий стол. Таким образом, утилита окажется полезной в случае, если у вас сломалась кнопка питания. При наличии ROOT и Xposed, Material Power Menu интегрируется в среду в качестве программного модуля и полностью заменяет системное меню выключения Android. Правда включается это меню не совсем удобно – повторным долгим нажатием на кнопку питания. Но на некоторых прошивках это может не сработать.
Единственным существенным недостатком приложения является отсутствие русского языка, а также тот факт, что программа не позволяет добавлять новые или изменять существующие пункты в меню выключения.
В отличие от предыдущих решений, данный способ с использованием приложения Quick Reboot не предусматривает каких-либо изменений в системном меню выключения Android. Quick Reboot – это довольно простая утилита, задача которой заменить собой кнопку питания устройства. То есть вы можете выключать свой смартфон или планшет по старинке (с помощью кнопки питания), либо через это приложение. Кроме основных параметров меню выключения, программа позволяет перезагрузиться в режим восстановления или загрузчика без запоминания комбинаций клавиш. Для удобства запуска команд Quick Reboot имеет виджеты.
Приложение имеет простой интерфейс с поддержкой русского языка, темы оформления и более 10 пользовательских опций для меню выключения. В целом все пункты меню работают исправно, а чего-то большего от утилиты ждать не стоит.
В итоге
Подводя итоги, можно выделить два основных момента, при которых подобные утилиты могут пригодиться. Первый – когда вы хотите модифицировать системное меню выключения Android и расширить его функциональные возможности необходимыми вам опциями. В этом случае советуем попробовать Xposed-модуль Advanced Power Menu с отличным набором функций.
Второй – это тот момент, когда у вас не работает кнопка питания или громкости (для комбинации, чтобы войти в режим загрузчика или восстановления) или наблюдаются проблемы с их нажатием. В этой ситуации такие приложения, как Material Power Menu и Quick Reboot придутся как нельзя кстати.
Первого месяца обучения. Рассмотрим работу с меню глубже. Будут рассмотрены как старые устройства под Android 2.3, так и новые телефоны на Android 4.0.
Меню выбора опций (Options Menu)
За меню отвечает класс android.view.Menu
. Каждая активность связана с одним объектом меню. Само меню содержит пункты меню (класс android.view.MenuItem
) и подменю (класс android.view.SubMenu
).
При нажатии кнопки Menu
на старых телефонах появляется набор пунктов меню, прикрепляемый к активности. Меню может содержать значки. Такое меню может содержать шесть пунктов (как правило). При наличии более шести пунктов используется расширенное меню - в этом случае вместо шестого пункта появляется пункт Опции
(More). При нажатии данного пункта показывается расширенное меню со списком пунктов, которые не поместились в основной части меню выбора опций.
Когда меню открывается впервые, Android вызывает метод onCreateOptionsMenu()
, передавая в качестве параметра объект Menu
. Меню можно создавать в виде ресурсов в XML-файле или использовать метод add()
.
В стандартном проекте при выборе обычного шаблона уже есть заготовка для меню из одного пункта Settings
и вызов метода для меню (вы об этом уже знаете).
Создание меню при помощи ресурсов
Рассмотрим работу с меню через ресурсы. Для создания меню используются ресурсы, которые должны храниться в XML-файле. Сам файл должен находиться в папке res/menu/
вашего проекта. Меню состоит из следующих элементов: