- . Это позволяет достичь некоторых эффектов
Предположим, мы решили использовать меню для какой-нибудь игры. Создадим новый файл game_menu.xml
:
Мы создали меню с двумя пунктами. Каждый пункт включает в себя следующие атрибуты:
Android:id Идентификатор пункта меню, по которому приложение может распознать при выделении пункта меню пользователем
android:title Текст, который будет выводиться в меню
Существуют и другие атрибуты для элемента item
, например android:icon="@drawable/home"
позволит также вывести значок для пункта меню, а android:enabled="false"
позволяет сделать пункт меню недоступным.
Атрибут android:titleCondensed
применяется в том случае, если обычный заголовок слишком широкий и не «помещается» в выбранном элементе меню.
Атрибут android:orderInCategory
определяет порядок, в котором отображаются элементы меню MenuItems.
При создании меню мы указали на строковые ресурсы @string/new_game
и @string/help
. Необходимо добавить новые строки в файле strings.xml
:
Новая игра
Справка
Теперь нужно внести изменения в классе активности, в котором будет выводиться меню. Программа должна сконвертировать созданный нами ресурс меню в программный объект. Для этой цели существует специальный метод MenuInflater.inflate()
, который вызывается в специальном методе обратного вызова onCreateOptionsMenu()
. Данный метод и предназначен для вывода меню при нажатии кнопки MENU
на устройстве:
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.game_menu, menu);
return true;
}
После вставки кода среда разработки попросит импортировать недостающие пространства имен.
Import android.view.Menu;
import android.view.MenuInflater;
Метод onCreateOptionsMenu()
метод инициирует первое появление меню на экране и принимает в качестве параметра объект Menu (для старых устройств). Вы можете сохранить ссылку на меню и использовать ее в любом месте кода, пока метод onCreateOptionsMenu()
опять не будет вызван. Вам необходимо всегда использовать реализацию этого обработчика из родительского класса, потому как она при необходимости автоматически включает в меню дополнительные системные пункты. В новых устройствах метод вызывается при создании активности. Метод должен возвращать значение true
, чтобы меню было видимым на экране.
Запустив программу, нажмите кнопку MENU
на эмуляторе, чтобы увидеть созданное меню.
Метод getMenuInflater()
возвращает экземпляр класса MenuInflater
, который мы используем для чтения данных меню из XML.
Как видите, меню появляется в нижней части экрана. Всего можно одновременно вывести на экран шесть пунктов меню. Если пунктов больше, то будет выведено пять пунктов плюс шестой пункт More
, который позволит увидеть остальные пункты. Давайте проверим и добавим новые пункты меню.
Сначала добавим шесть пунктов.
Добавим еще один пункт к меню, чтобы их стало семь.
Выбор пунктов меню
Мы научились создавать меню. Но пока оно бесполезно, так как пункты меню никак не реагируют на наши нажатия. Для обработки нажатий пунктов меню служит метод onOptionsItemSelected()
. Метод распознает пункт, выбранный пользователем, через MenuItem
. Мы можем теперь определить выбранный пункт через вызов getItemId()
, который возвращает идентификатор пункта меню. Далее через оператор switch
нам остается определить нужные команды:
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
// Операции для выбранного пункта меню
switch (item.getItemId())
{
case R.id.new_game:
newGame();
return true;
case R.id.help:
showHelp();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
public void newGame()
{
edtext.setText("Выбран пункт Новая игра");
}
public void showHelp()
{
edtext.setText("Выбран пункт Справка");
}
Запустите приложение, вызовите меню и выберите первый или второй пункт меню. В текстовом поле должно появиться сообщение.
В приведенном примере getItemId()
запрашивает ID для выбранного пункта меню и начинает сравнивать через оператор выбора switch с идентификаторами, которые мы задали в XML-ресурсах. При обнаружении нужного идентификатора выполняется обработчик для заданного пункта меню. Если программа ничего не обнаружит, то выполняется оператор default
, который возвращает super class.
В Android 3.0 можно добавить атрибут android:onClick
в ресурсах меню, и вам уже не нужно использовать onOptionsItemSelected()
. При помощи android:onClick
вы можете указать нужный метод при выборе пункта меню.
// у атрибута пункта меню установлено значение android:onClick="onMenuClick"
public void onMenuClick(MenuItem item){
edtext.setText("Выбран пункт Накормить кота");
}
Программное создание меню
Рассмотрим программное создание меню для полноты картины. Нам понадобится определить несколько констант для пунктов меню:
// идентификаторы для пунктов меню
private static final int IDM_OPEN = 101;
private static final int IDM_SAVE = 102;
public boolean onCreateOptionsMenu(Menu menu)
{
// добавляем пункты меню
menu.add(Menu.NONE, IDM_OPEN, Menu.NONE, "Открыть");
menu.add(Menu.NONE, IDM_SAVE, Menu.NONE, "Сохранить");
}
У метода add()
есть четыре параметра:
- идентификатор группы - позволяет связывать пункт меню с группой других пунктов этого меню
- идентификатор пункта для обработчика события выбора пункта меню
- порядок расположения пункта в меню - позволяет определять позицию в меню. По умолчанию (Menu.NONE или 0) пункты идут в том порядке, как задано в коде
- заголовок - текст, который выводится в пункте меню. Можно использовать строковый ресурс
Метод возвращает объект MenuItem
, который можно использовать для установки дополнительных свойств, например, для установить значок, горячую клавишу и т.д.
Если вы хотите создать меню со значками, то воспользуйтесь методом setIcon()
Menu.add(Menu.NONE, IDM_OPEN, Menu.NONE, "Открыть")
.setIcon(R.drawable.icon_menu_open);
Напомним еще раз, что значки можно добавить только к шести пунктам меню (или к пяти, если пунктов больше шести).
Метод onCreateOptionsMenu
вызывается системой только один раз при создании меню. Если вам требуется обновить меню во время работы программы, то используйте метод обратного вызова onPrepareOptionsMenu()
.
При выборе пункта меню вызывается метод onOptionsItemSelected
, который передает объект MenuItem
- пункт меню, выбранный пользователем. При помощи метода getItemId
можно получить идентификатор выбранного пункта меню. После идентификации пункта меню можно написать код для обработки события выбора меню:
Public boolean onOptionsItemSelected(MenuItem item)
{
switсh (item.getItemId())
case IDM_OPEN:
return true;
case IDM_SAVE:
return true;
return false;
}
Горячие клавиши
Также можно задавать горячие клавиши для быстрого доступа, используя символы клавиатуры, при помощи нескольких методов:
- setAlphabeticShortcut(char) - добавляет символ
- setNumericShortcut(int) - добавляет число
- setShortcut(char, int) - добавляет комбинацию символа и числа
Например, если задать горячую клавишу setAlphabeticShortcut("q");, то при открытии меню (или при удерживании клавиши MENU) нажатие клавиши Q
выберет данный пункт меню. Эта горячая клавиша (или сочетание клавиш) будет показана как подсказка, отображающая ниже имени пункта меню. В новых клавиатурах есть отдельная клавиша Ctrl
, которая работает также, как на обычных клавиатурах.
Горячие клавиши можно создать и через XML: android:alphabeticShortcut="c"
.
Обрабатывать нажатия можно через метод активности onKeyShortcut()
:
@Override
public boolean onKeyShortcut(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_R:
Toast.makeText(this, "Reply", Toast.LENGTH_SHORT).show();
return true;
default:
return super.onKeyShortcut(keyCode, event);
}
}
Создание подменю
Подменю можно добавить в любое меню, кроме другого подменю. Подменю создается в методе обратного вызова onCreateOptionsMenu()
с помощью метода addSubMenu()
, который возвращает объект SubMenu
. В объект SubMenu
можно добавить дополнительные пункты к этому меню, используя метод add()
. Например:
Public static final int IDM_HELP = 101;
public static final int IDM_NEW = 201;
public static final int IDM_OPEN = 202;
public static final int IDM_SAVE = 203;
public static final int IDM_CUT = 301;
public static final int IDM_COPY = 302;
public static final int IDM_PASTE = 303;
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
SubMenu subMenuFile = menu.addSubMenu("Файл");
subMenuFile.add(Menu.NONE, IDM_NEW, Menu.NONE, "Новый");
subMenuFile.add(Menu.NONE, IDM_OPEN, Menu.NONE, "Открыть");
subMenuFile.add(Menu.NONE, IDM_SAVE, Menu.NONE, "Сохранить");
SubMenu subMenuEdit = menu.addSubMenu("Правка");
subMenuEdit.add(Menu.NONE, IDM_CUT, Menu.NONE, "Вырезать");
subMenuEdit.add(Menu.NONE, IDM_COPY, Menu.NONE, "Копировать");
subMenuEdit.add(Menu.NONE, IDM_PASTE, Menu.NONE, "Вставить");
menu.add(Menu.NONE, IDM_HELP, Menu.NONE, "Справка");
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
CharSequence message;
switch (item.getItemId()) {
case IDM_NEW:
message = "Выбран пункт Новый";
break;
case IDM_OPEN:
message = "Выбран пункт Открыть";
break;
case IDM_SAVE:
message = "Выбран пункт Сохранить";
break;
case IDM_CUT:
message = "Выбран пункт Вырезать";
break;
case IDM_COPY:
message = "Выбран пункт Копировать";
break;
case IDM_PASTE:
message = "Выбран пункт Вставить";
break;
case IDM_HELP:
message = "Выбран пункт Справка";
break;
default:
return false;
}
// выводим уведомление о выбранном пункте меню
Toast toast = Toast.makeText(this, message, Toast.LENGTH_LONG);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
return true;
}
Теперь при выборе пункта меню появится еще одно окно с подменю. Попробуйте сами.
Добавление флажков и переключателей
В пункты меню возможно добавление флажков или переключателей. Чтобы добавить флажок или переключатель для отдельного элемента меню, необходимо
использовать метод setCheckable()
:
MenuItem item = menu.add(0, IDM_FORMAT_BOLD, 0, "Bold");
item.setCheckable(true);
Если есть необходимость добавить несколько пунктов меню с флажками или переключателями, то можно объединить их в группы меню, создав отдельный идентификатор. Пункт меню добавляется в группу через метод add()
, передав ему в качестве первого параметра идентификатор группы меню. Допустим, мы объявили идентификаторы для группы меню Цвет и элементов меню для установки цвета:
Public static final int IDM_COLOR_GROUP = 400;
public static final int IDM_COLOR_RED = 401;
public static final int IDM_COLOR_GREEN = 402;
public static final int IDM_COLOR_BLUE = 403;
Теперь для создания группы меню с флажками нужно назначить идентификатор группы на каждый пункт меню и вызвать метод setGroupCheckable()
для всей группы (этом случае нет необходимости вызывать метод setCheckable()
для каждого пункта меню):
SubMenu subMenuColor = menu.addSubMenu("Цвет");
subMenuColor.add(IDM_COLOR_GROUP, IDM_COLOR_RED, Menu.NONE, "Красный");
subMenuColor.add(IDM_COLOR_GROUP, IDM_COLOR_GREEN, Menu.NONE,"Зеленый");
subMenuColor.add(IDM_COLOR_GROUP, IDM_COLOR_BLUE, Menu.NONE, "Синий");
subMenuColor.setGroupCheckable(IDM_COLOR_GROUP, true, false);
У метода setGroupCheckable()
три параметра:
- первый параметр - идентификатор группы меню;
- второй параметр - true, если в группе разрешены переключатели или флажки;
- третий параметр - устанавливает единственный (true) или множественный (false) выбор пунктов меню. Этот параметр фактически определяет внешний вид
меню - это будет меню с переключателями или флажками.
Для управления состоянием флажков и переключателей в обработчике события выбора пункта меню нужно написать следующее:
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
CharSequence message;
switch (item.getItemId()) {
...
case IDM_COLOR_RED:
// инвертируем состояние флажка
item.setChecked(!item.isChecked());
message = "Красный цвет";
break;
default:
return false;
}
Запустите проект, вызовите меню и выберите пункт меню Цвет
. У вас появится подменю с тремя пунктами (Красный, Зеленый, Синий) в виде флажков. Состояние флажков и переключателей обрабатывается в коде программы и сохраняется при повторных вызовах меню.
Можно сразу назначить намерение выбранному пункту меню через метод setIntent(), которое сработает при нажатии этого пункта, если данное событие не было перехвачено обработчиками onMenuItemClickListener (устар.) или onOptionsItemSelected. Сработав, намерение передается в метод startActivity.
MenuItem.setIntent(new Intent(this, MyOtherActivity.class));
Программное открытие или закрытие меню
Если вам по каким-то причинам нужно программно открыть меню (например, в демонстрационных целях), то используйте метод openOptionsMenu()
:
OpenOptionsMenu();
Для программного закрытия меню используйте метод closeOptionsMenu()
, впрочем у меня повторный вызов метода openOptionsMenu()
также закрывает меню.
Программное удаление пункта меню
Допустим, мы определили пункт меню в xml-файле:
Чтобы удалить явно лишний пункт меню из нашей программы о котах, нужно получить доступ к пункту меню через метод findItem()
и сделать его невидимым. Ссылку на объект Menu нужно передать в метод onCreateOptionsMenu
, чтобы программа узнала об изменении состава меню.
// переменная класса
Menu menu;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
// передаём ссылку на наш объект
this.menu = menu;
getMenuInflater().inflate(R.menu.test, menu);
return true;
}
// щелчок кнопки
public void onClick(View v) {
if (menu != null) {
// находим нужный элемент
MenuItem item_dog = menu.findItem(R.id.action_dog);
// делаем его невидимым
item_dog.setVisible(false);
}
}
Но у данного решения есть недостаток, если мы повернём экран, то активность пересоздатся и удалённое меню снова появится. Как же нам избавиться от сранного пёсика?
Надо запомнить состояние пункта меню и сохранить его в объекте типа Bundle в методе onSaveInstanceState
, а в методе onCreate()
извлечь сохранённое состояние и передать методу onPrepareOptionsMenu
, который вызывается перед показом меню на экране:
Package ru.alexanderklimov.test;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
public class TestActivity extends Activity {
Menu menu;
Boolean savedMenuDogIsVisible;
final static String KEY_MENU_DOG = "KEY_MENU_DOG";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
// извлекаем данные о видимости пункта меню
if (savedInstanceState != null) {
savedMenuDogIsVisible = savedInstanceState.getBoolean(KEY_MENU_DOG,
true);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
this.menu = menu;
getMenuInflater().inflate(R.menu.test, menu);
return true;
}
public void onClick(View v) {
if (menu != null) {
MenuItem item_dog = menu.findItem(R.id.action_dog);
// прячем пункт меню
item_dog.setVisible(false);
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
// TODO Auto-generated method stub
super.onSaveInstanceState(outState);
if (menu != null) {
MenuItem item_dog = menu.findItem(R.id.action_dog);
// сохраняем текущее состояние пункта меню - true или false
outState.putBoolean(KEY_MENU_DOG, item_dog.isVisible());
}
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
if (savedMenuDogIsVisible != null) {
MenuItem item_dog = menu.findItem(R.id.action_dog);
// перед выводом на экран узнаём нужное состоятние пункта меню
item_dog.setVisible(savedMenuDogIsVisible);
}
return super.onPrepareOptionsMenu(menu);
}
}
Определить наличие кнопки Menu
На старых устройствах использовалась реальная кнопка Menu. В новых версиях Android меню убрали в ActionBar и её наличие в виде отдельной кнопки стало необязательным. Но многие производители по-прежнему выпускают телефоны с кнопкой для меню. Чтобы определить, есть ли такая кнопка, в Android 14 добавили новый метод, который позволит определить наличие этой кнопки.
If (Build.VERSION.SDK_INT <= 10
|| (Build.VERSION.SDK_INT >= 14 && ViewConfiguration.get(this)
.hasPermanentMenuKey())) {
// menu key is present
Toast.makeText(this, "Кнопка Menu есть", Toast.LENGTH_LONG).show();
} else {
// No menu key
Toast.makeText(this, "Кнопки Menu нет", Toast.LENGTH_LONG).show();
}
Разметка для меню
В современных устройствах меню является частью ActionBar
. И вы можете настроить разметку меню через XML.
Допустим, вы выбрали такой вариант:
В атрибуте showAsAction
не используйте значение never
, иначе разметку не увидите. Сама разметка задана через атрибут actionLayout
. Код для разметки:
Меню в фрагментах
Меню может быть не только частью активности, но и частью фрагмента. Принцип работы практически не отличается. У фрагмента есть соответствующий метод.
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.fragment_crime_list, menu);
}
FragmentManager
отвечает за вызов onCreateOptionsMenu()
при получении активностью обратного вызова onCreateOptionsMenu()
от системы. Вы должны явно сообщить менеджеру FragmentManager
, что фрагмент должен получить вызов onCreateOptionsMenu()
. Для этого вызывается метод setHasOptionsMenu()
:
// В коде фрагмента
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
getActivity().setTitle(R.string.cat);
...
}
Главное меню - один из основных инструментов для взаимодействия пользователя с приложением. В Android 2.3.x и раньше оно было «спрятано» на аппаратной кнопке Menu, и разработчики рисовали меню кто как умел. Но начиная с Android 3.0 недоработка была исправлена, меню стало стандартным компонентом на Action Bar, и получило ряд новых возможностей. При этом процесс разработки меню практически не претерпел изменений. Меню в Android - это не просто набор кнопок, на которые можно вешать OnClickListener . В Android с меню можно сделать куда больше, чем кажется на первый взгляд.
В этой статье я расскажу, как сделать современное меню, как адаптировать его для разных размеров экрана, как делать переключатели типа radio button прямо в меню, а также как динамически управлять видимостью кнопок меню, скрывая те функции вашего приложения, которые не будут работать на том или ином смартфоне. По ходу статьи постараюсь дать максимально подробное описание тех или иных возможностей меню, а также дам ссылки на официальную документацию по теме.
Вот так по-разному может выглядеть меню одного и того же приложения.
Наша первая кнопка в меню
Меню в Android описываются в файлах ресурсов или формируются программным кодом. Рекомендуется первый вариант по целому ряду причин: скорость разработки, наглядность, простота сопровождения. Ресурсы меню располагаются в подкаталоге menu каталога ресурсов приложения res . Создаем каталог menu , затем создаем новый Android XML File:Выбираем тип ресурса Menu , вводим имя файла. Так как в разных activity меню, скорее всего, будет разным, рекомендую привязывать имена файлов ресурсов меню к именам activity.
В открывшемся редакторе введем код первой кнопки нашего меню:
Давайте рассмотрим использованные атрибуты:
- android:id указываем, чтобы потом в коде отличать одни кнопки от других.
- android:orderInCategory указывает порядок нашей кнопки относительно других. Указывайте порядок с шагом в 10 или 100, это позволит в будущем добавлять новые элементы в любое место, не перестраивая порядок остальных.
- android:showAsAction - самый интересный параметр, поскольку именно он управляет поведением элементов меню в разных ситуациях. Он может принимать целый ряд значений:
- ifRoom - Показывать элемент в action bar, только если для него достаточно места. Если места недостаточно, элемент будет автоматически скрыт в дополнительное меню (то, которое показано тремя точками друг над другом). Это лучший способ кастомизации меню в зависимости от размера экрана устройства. На больших экранах планшетов action bar будет заполнен кнопками, а на небольших телефонах будут показаны самые важные кнопки, в то время как до остальных тоже можно добраться, но только через дополнительное меню. Имейте в виду, что дополнительное меню отображается в action bar только на тех смартфонах, на которых нет аппаратной кнопки меню.
- withText - Рядом с иконкой кнопки будет показан текст, заданный свойством android:title . Этот параметр можно указывать в комбинации с другими, разделяя параметры знаком |
- never - Кнопка никогда не будет видна на action bar, даже если для нее есть место. К такой кнопке всегда придется добираться через дополнительное меню.
- always - Всегда показывать кнопку в action bar. Данным параметром нельзя злоупотреблять, так как на маленьких телефонах кнопки могут начать заползать на другие элементы action bar, например на заголовок приложения. Определите для каждой activity максимум одну самую важную кнопку, без которой никак нельзя, и отметьте always только у нее. Остальные (а по возможности все) должны быть ifRoom .
- collapseActionView - позволяет сделать кнопку, открывающую или скрывающую дополнительный элемент View в action bar. Например, можно задать такой параметр иконке поиска, по ее клику показывать прямо в action bar поле для ввода поискового запроса.
- android:title - определяет заголовок кнопки меню. Он может отображаться рядом с иконкой в action bar или же как название элемента в дополнительном меню.
- android:icon - иконка кнопки.
Иконки для меню
Если вы разрабатываете приложение в стиле Holo, вы можете использовать готовый набор иконок от Google, который доступен всем для загрузки с официального сайта совершенно бесплатно.Набор иконок представлен отдельно для темной и отдельно для светлой темы Holo, а также для разных размеров экранов. Если вы не можете позволить себе дизайнера в команде, этот набор просто незаменим.
Подключение меню к Activity
Загрузить меню из ресурса очень быстро. Открываем код Activity и перекрываем метод onCreateOptionsMenu:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.your_activity_menu, menu);
return true;
}
Теперь меню отображается, но при нажатии на кнопку ничего не происходит. Повесить обработчик на кнопку можно кодом или прямо в XML-ресурсе, задав в свойстве android:onClick имя метода-обработчика. Чтобы сделать то же самое кодом, нужно в Activity перекрыть метод onOptionsItemSelected:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menuPurchasesListNewRecord:
// TODO: обработчик нажатия здесь
return true;
}
return super.onOptionsItemSelected(item);
}
Создаем подменю
Подменю полезно, когда мы хотим уточнить способ выполнения действия, представленного в action bar. К примеру, у нас есть список покупок и кнопка «Сортировка». По нажатию кнопки нужно выяснить, по какому параметру пользователь хочет отсортировать элементы списка: по категории товара, по названию или по порядку добавления в список. Посмотрим код подменю для такого случая: -
Здесь мы объявили еще один тег внутри тега. Подменю представляет собой группу все тех же тегов, что позволяет при необходимости сделать подменю в подменю и так далее.
Radio button"ы в меню
Мы только что сделали меню для выбора порядка сортировки покупок. Было бы здорово показывать, какой способ сортировки используется в текущий момент. Список может быть отсортирован только одним из трех возможных способов, что отлично соответствует идее radio button. Чтобы сделать из нашего подменю набор radio button, достаточно тегу указать свойство android:checkableBehavior="single" . Возможные значения android:checkableBehavior:- single - выбор только одного из доступных элементов, наш случай
- all - выбор любого количества доступных элементов, аналог check box
- none - элементы группы являются обычными элементами меню, это значение по умолчанию
Полученный код меню:
-
Если запустить приложение и попробовать выбрать один из способов сортировки, ничего не произойдет. В меню не показано, что какой-то элемент выбран. Это придется сделать вручную вызовом item.setChecked(true);
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menuPurchasesListNewRecord:
// TODO: обработчик нажатия здесь
return true;
case R.id.menuPurchasesListSortOrderCategory:
item.setChecked(true);
return true;
case R.id.menuPurchasesListSortOrderName:
item.setChecked(true);
return true;
case R.id.menuPurchasesListSortOrderAddTime:
item.setChecked(true);
return true;
}
return super.onOptionsItemSelected(item);
}
Если у вас остались вопросы по работе с главным меню, буду рад ответить в комментариях.
Производители смартфонов на Андроид для тестирования устройств внедряют и используют инженерное меню. В нём содержатся всевозможные тесты и настройки аппарата, недоступные рядовым пользователям. Однако сегодня, зная USSD-команду или скачав приложение с PlayMarket, зайти в инженерное меню может любой желающий.
Зачем нужно скрытое инженерное меню в Андроид
Инженерное меню (Engineering Mode) – по своей сути скрытое приложение, которое используют разработчики для тестирования и установки оптимальных параметров мобильного телефона или планшета. Специалисты проверяют работу датчиков и при необходимости вносят корректировки в функционирование системных компонентов.
Работая с техническим меню Android, будьте осторожны - изменение части функций приводит к сбоям в работе устройства.
Как войти в меню
Чтобы открыть меню, установленное производителем, активируйте на смартфоне панель набора номера и введите одну из представленных в таблице USSD-команд. После ввода команды цифры пропадут с экрана, а вместо них откроется меню.
Таблица: комбинации для запуска Engineering Mode
Видео: как работать в Engineer Mode
Если код не действует, и стандартным способом запустить сервисное меню не удаётся, используйте сторонние приложения - загрузить их можно на PlayMarket. Рекомендуемые программы - «Запуск инженерного меню МТК», Mobileuncle Tools, Shortcut Master.
Меню производителей не работает на некоторых моделях устройств с Android 4.2 JellyBean (x.x.1, x.x.2), а также на Android 5.1 Lollipop. Также недействительно меню при установленной прошивке Cyanogen Mod. В Android 4.4.2 при перезагрузке сбрасываются изменения, произведённые в приложении.
«Запуск инженерного меню МТК»
Приложение позволяет открыть и настроить инженерное меню без набора цифровых команд. Корректно работает на процессорах MediaTek (МТ6577, МТ6589 и др.) и системами Android 2.x, 3.x, 4.x, 5.x. По отзывам пользователей программа успешно выполняет свои функции, но после перезагрузки смартфона происходит сброс настроек, сделанных с помощью приложения.
Программа Mobileuncle Tools
Функционал приложения аналогичен предыдущему, но, помимо доступа к инженерному меню, пользователь получает возможность просмотреть информацию об экране, сенсоре и памяти устройства, а также обновить прошивку, восстановить IMEI-номер и улучшить GPS. Для стабильного функционирования необходимы root-права.
Утилита Shortcut Master
Программа Shortcut Master предназначена для работы с ярлыками и системными приложениями: создания, поиска, удаления. Прямой функции входа в инженерное меню в ней нет. Но с её помощью вы можете просмотреть список секретных команд, действующих на вашем устройстве. А нажав на название команды, увидите выпадающее меню, в котором будет пункт «выполнить». Удобно, и не требует лишних действий.
Root-права для доступа в инженерное меню
Чтобы попасть в сервисное меню на некоторых версиях Андроид, пользователь должен обладать правами суперпользователя (root). Получить права можно с помощью специализированных приложений: Farmaroot, UniversalAndRoot, Romaster SU и других. Чтобы получить Root-доступ к устройству с помощью Farmaroot:
- Установите и запустите в программу. Ссылка в Google Play: https://play.google.com/store/apps/details?id=com.farmaapps.filemanager&hl=ru.
- Если приложение поддерживает установку root-прав на ваше устройство, то на экране вы увидите список возможных действий, среди них – «Получить root». Выберите этот пункт.
- Выберите один из предустановленных методов получения root.
- Программа начнёт установку.
- По окончании процедуры вы увидите сообщение об успешной установке root доступа.
Возможные проблемы и решения:
- приложение закрылось на середине установки - перезапустите аппарат и попробуйте снова;
- root-права не установились - попробуйте установить иным методом (выберите новый эксплоит в приложении).
Что можно настроить в меню
Внешний вид инженерного режима и возможности регулировки параметров могут различаться в зависимости от модели планшета или смартфона. В меню пользователи чаще всего регулируют звук, меняют настройки камеры и используют режим восстановления. Параметры для корректировки и порядок действий приведены ниже. Будьте внимательны - названия пунктов меню могут различаться в различных моделях устройств! Вы действуете на свой страх и риск.
Аудио: усилить уровень громкости
Если ваш телефон звонит недостаточно громко, в инженерном меню найдите раздел Audio и перейдите в LoudSpeaker Mode. Выберите пункт Ring. Для каждого уровня сигнала (level 1–6) смените значения - выставьте цифры по возрастанию, от 120 до 200. Увеличьте значение в пункте Max. Vol - максимальное 200. Нажмите кнопку SET для сохранения настроек.
Аудио: повысить громкость телефонного разговора
Чтобы усилить тон динамика для разговоров, в разделе сервисного меню Audio выберите Normal mode и откройте пункт Sph. Установите значения для уровней сигнала (level 1–6) от 100 до 150, а цифру у Max. Vol. – до 160.
Для усиления чувствительности микрофона пройдите в меню Audio - Normal mode - Mic. Для каждого уровня присвойте одинаковые значения чувствительности микрофона, к примеру, 200. Нажмите кнопку SET, выполните перезагрузку и проверьте, стал ли собеседник слышать вас лучше.
Видео: регулировка параметров звука в инженерном меню
Батарея: отключение неиспользуемых частот
Смартфоны быстро расходуют ресурс батареи на работу приложений, поддержание сотовой связи и сетевые подключения. С помощью инженерного меню вы можете увеличить длительность работы аккумулятора.
Современные устройства сканируют несколько GSM-частот - 900/1800 МГц и 850/1900 МГц. В России действует пара 900/1800 МГц, а значит, нет необходимости сканировать сеть на других частотах. Радиосигнал для второй пары можно отключить, что существенно сэкономит уровень заряда.
В Engineer Mode откройте пункт Band Mode. Отключите неиспользуемые частоты, сняв галочки с соответствующих пунктов - PCS1900 и GSM850. Если аппарат поддерживает две сим-карты, откройте поочерёдно пункты SIM1 и SIM2 и выполните указанные действия в каждом. Нажмите кнопку SET, чтобы сохранить настройки.
Если смартфон и сим-карта работают в 3G-сетях, отключите сети, которые не используются в России: WCDMA-PCS 1900, WCDMA-800, WCDMA-CLR-850. Вновь нажмите кнопку SET.
Включить сканирование отключённых сетей можно, вернувшись в то же меню и установив галочки.
Камера: настройки фото и видео
По умолчанию аппараты на Android сохраняют снимки в формате JPEG. Между тем фотографы предпочитают снимать и обрабатывать материал в RAW, чтобы получить больше возможностей для редактирования. Техническое меню позволяет выбрать желаемый формат снимков.
В меню найдите пункт Camera и выберите Capture Type (Тип снимка). Установите формат фото - RAW и нажмите SET. Также в меню Camera можно увеличить размер снимков, установить значение ISO, включить съёмку в HDR для более высокой детализации фото, задать частоту кадров для видео. После изменения каждого параметра не забывайте нажимать SET для сохранения настроек.
Режим восстановления
Recovery Mode (Режим восстановления) – аналог Bios на компьютере, позволяет управлять устройством без входа в систему Android. Возможности режима восстановления:
- обнуление настроек до стандартных;
- обновление прошивки;
- доступ к root-правам;
- создание резервной копии ОС;
- удаление персональных данных из системы.
В Recovery Mode не выполняйте действие, если не уверены в том, к чему оно приведёт. Некоторые команды могут навредить устройству и системе.
Если настройки не сохранились
Пользователи, получившие доступ к техническому меню, жалуются на то, что изменённые в нём параметры не активируются либо сбрасываются при перезапуске аппарата.
Для ввода в действие настроек после смены параметров делайте тап на кнопку SET внизу экрана. Если параметры сбрасываются после перезагрузки устройства, попробуйте зайти в техническое меню не через приложение, а с помощью цифровой команды.
Коды сервиса аппаратов на Андроид
Помимо технического меню, управлять функционалом смартфонов на Android позволяют секретные USSD-коды - сочетания цифр и символов, набрав которые пользователь выполняет действие. Секретные коды для разных устройств приведены в таблице.
Таблица: перечень секретных команд для Android
Если по какой-то причине сервисный код не сработал, не расстраивайтесь - установите и запустите приложение Secret Codes (Ссылка в Google Play: https://play.google.com/store/apps/details?id=fr.simon.marquis.secretcodes&hl=ru).
Программа проанализирует действующие в устройстве комбинации и предложит вам список. Активировать комбинацию можно прямо в приложении одним нажатием на название.