Меню
Ви вже працювали з меню на одному з перших уроків першого місяця навчання. Розглянемо роботу з меню глибше. Розглянуть як старі пристрої під Android 2.3, так і нові телефони на Android 4.0.
Меню вибору опцій (Options Menu)
За меню відповідає клас android.view.Menu. Кожна активність пов'язана з об'єктом меню. Саме меню містить пункти меню (клас android.view.MenuItem) та підменю (клас android.view.SubMenu).
При натисканні кнопки Menu на старих телефонах з'являється набір пунктів меню, що кріпиться до активності. Меню може містити піктограми. Таке меню може містити шість пунктів (зазвичай). За наявності більше шести пунктів використовується розширене меню – у цьому випадку замість шостого пункту з'являється пункт Опції (Більше). При натисканні цього пункту відображається розширене меню зі списком пунктів, які не помістилися в основному меню вибору опцій.
Коли меню відкривається вперше, Android викликає метод onCreateOptionsMenu(), передаючи як параметр об'єкт Menu. Меню можна створювати у вигляді ресурсів у XML-файлі або використовувати метод add().
У стандартному проекті при виборі звичайного шаблону є заготівля для меню з одного пункту Settings та виклик методу для меню (ви про це вже знаєте).
Створення меню за допомогою ресурсів
Розглянемо роботу з меню через ресурси. Для створення меню використовуються ресурси, які потрібно зберігати в XML-файлі. Сам файл повинен знаходитись у папці res/menu/ вашого проекту. Меню складається з наступних елементів:
Визначає меню, яке містить пункти меню. Елемент повинен бути кореневим елементом у структурі XML файлу і може містити один або кілька елементів і Створює безпосередньо пункти меню. Цей елемент може мати вкладений елемент для створення підменю. При бажанні також можете використовувати невидимий контейнер для елементів. Це дозволяє досягти деяких ефектів
Припустимо, ми вирішили використовувати меню для будь-якої гри. Створимо новий файл game_menu.xml:
Ми створили меню із двома пунктами. Кожен пункт включає наступні атрибути:
android:id Ідентифікатор пункту меню, за яким програма може розпізнати при виділенні пункту меню користувачем android:title Текст, який буде виводитися в меню
Існують інші атрибути для елемента item, наприклад android:icon="@drawable/home" дозволить також вивести значок для пункту меню, а android:enabled="false" дозволяє зробити пункт меню недоступним.
Атрибут android:titleCondensed застосовується в тому випадку, якщо звичайний заголовок занадто широкий і не розміщується у вибраному елементі меню.
Атрибут android:orderInCategory визначає порядок, де відображаються елементи меню MenuItems.
До речі, можна використовувати вбудовані системні значки Android. Наприклад, android:icon="@android:drawable/ic_menu_help" дозволить вам вивести значок допомоги, який зашитий у систему. Докладніше про системні значки почитайте у статті Системні графічні ресурси
Під час створення меню ми вказали на рядкові ресурси @string/new_game і @string/help. Необхідно додати нові рядки у файлі strings.xml:
Нова гра
Довідка
Тепер потрібно внести зміни до класу активності, в якому виводитиметься меню. Програма повинна конвертувати створений нами ресурс меню програмний об'єкт. Для цієї мети існує спеціальний метод MenuInflater.inflate(), який викликається у спеціальному методі зворотного виклику onCreateOptionsMenu(). Цей метод призначений для виведення меню при натисканні кнопки MENU на пристрої:
@Override public boolean onCreateOptionsMenu(Menu menu)
Після вставки коду середовище розробки попросить імпортувати відсутні простору імен.
import android.view.Menu; import android.view.MenuInflater;
Метод onCreateOptionsMenu() метод ініціює першу появу меню на екрані та приймає як параметр об'єкт Menu (для старих пристроїв). Ви можете зберегти посилання на меню і використовувати її в будь-якому місці коду, поки метод onCreateOptionsMenu() знову не буде викликано. Вам необхідно завжди використовувати реалізацію цього оброблювача з батьківського класу, тому що вона при необхідності автоматично включає додаткові системні пункти в меню. У нових пристроях метод викликається під час створення активності. Метод повинен повертати значення true, щоб меню відображалося на екрані.
Запустивши програму, натисніть кнопку MENU на емуляторі, щоб побачити створене меню.
Метод getMenuInflater() повертає екземпляр класу MenuInflaterми використовуємо для читання даних меню з XML.
Як бачите, меню з'являється у нижній частині екрана. Усього можна одночасно вивести на екран шість пунктів меню. Якщо пунктів більше, то буде виведено п'ять пунктів плюс шостий пункт Більше, який дозволить побачити решту пунктів. Давайте перевіримо та додамо нові пункти меню.
Спочатку додамо шість пунктів.
Додамо ще один пункт до меню, щоб їх стало сім.
Вибір пунктів меню
Ми навчилися створювати меню. Але поки що воно марне, тому що пункти меню ніяк не реагують на наші натискання. Для обробки натискань пунктів меню слугує метод 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()
Запустіть програму, викличте меню та виберіть перший або другий пункт меню. У текстовому полі з'явиться повідомлення.
У наведеному прикладі getItemId() запитує ID для вибраного пункту меню та починає порівнювати через оператор вибору switch з ідентифікаторами, які ми задали у XML-ресурсах. При виявленні потрібного ідентифікатора виконується обробник заданого пункту меню. Якщо програма нічого не виявить, то виконується оператор defaultякий повертає super class.
До Android 3.0 можна додати атрибут android:onClick у ресурсах меню, і вам уже не потрібно використовувати onOptionsItemSelected(). За допомогою android:onClick Ви можете вказати потрібний метод під час вибору пункту меню.
// атрибут пункту меню має значення android:onClick="onMenuClick" public void onMenuClick(MenuItem item)
Програмне створення меню
Розглянемо програмне створення меню для повноти картини. Нам потрібно буде визначити кілька констант для пунктів меню:
// ідентифікатори пунктів меню 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)
Гарячі клавіші
Також можна задавати гарячі клавіші для швидкого доступу, використовуючи символи клавіатури за допомогою кількох методів:
- 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():
Для програмного закриття меню використовуйте метод 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 у методі назаписідержави, а в методі 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 зберігаєтьсяMenuDogIsVisible; 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 = 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)
FragmentManager відповідає за виклик onCreateOptionsMenu() при отриманні активністю зворотного дзвінка onCreateOptionsMenu() від системи. Ви повинні явно повідомити менеджера FragmentManager, що фрагмент повинен отримати виклик onCreateOptionsMenu(). Для цього викликається метод setHasOptionsMenu():
// У коді фрагмента @Override public void onCreate(Bundle savedInstanceState)
Що таке меню та типи меню в Android?
В Android є три типи меню: спливаюче, контекстне та меню «Параметри». У кожного з них є конкретний варіант використання та відповідний код. Щоб дізнатись, як їх використовувати, читайте далі. Кожне меню повинно мати пов'язаний з ним XML-файл, що визначає його структуру.
Що таке система меню Android?
Меню налаштувань системи Android дозволяє вам контролювати більшість аспекти вашого пристрою - все, від встановлення нового з'єднання Wi-Fi або Bluetooth, до встановлення сторонньої екранної клавіатури, до настроювання системних звуків та яскравості екрана.
Скільки меню є в Android Studio?
В android у нас є три типи Доступні меню для визначення набору параметрів та дій у наших програмах для Android.
Які бувають два типи спливаючих меню?
- Контекстні режими дій - режим дії, який включається, коли користувач вибирає елемент. .
- PopupMenu – модальне меню, прив'язане до певного подання всередині дії. .
- PopupWindow – просте діалогове вікно, яке отримує фокус при появі на екрані.
Де в андроїді головне меню?
На головному екрані проведіть вгору або натисніть кнопку Всі програми, який доступний на більшості смартфонів Android, для доступу до екрана "Всі програми". Коли ви опинитеся на екрані «Всі програми», знайдіть програму «Параметри» та натисніть на неї. Його значок виглядає як зубчасте колесо. Відкриється меню налаштувань Android.
Яка користь від меню в Android?
Меню параметрів Android – це головне меню Android. Їх можна використати для налаштувань, пошуку, видалення елемента тощо. буд.. Коли та як цей елемент повинен відображатися як елемент дії на панелі програми, визначається атрибутом "Показати дію".
Які типи меню існують в Android?
В Android є три типи меню: Спливне вікно, контекстне меню та параметри. У кожного з них є конкретний варіант використання та відповідний код. Щоб дізнатись, як їх використовувати, читайте далі. Як показано у наведеному вище фрагмент коду, кожен пункт меню має різні пов'язані з ним атрибути.
Які типи карт меню?
- Що таке меню а ля карт?
- Що таке меню Du Jour?
- Що таке циклічне меню?
- Що таке статичне меню?
- Що таке меню?
- Що таке меню напоїв?
- Що таке коктейльне меню?
- Що таке десертне меню?
Що таке showAsAction?
android: ключове слово showAsAction. Коли і як це елемент повинен відображатися як елемент дії на панелі програми. Пункт меню може відображатися як елемент дії, лише якщо дія включає панель програми.
Які два типи спливаючих меню в VB?
Спливаюче меню - корисна метафора. Спливаючі меню іноді називають швидкісними меню, контекстне меню, або контекстне меню. Спливаючі меню зазвичай викликаються клацанням правої кнопки миші.
Яке меню називається спливаючим меню?
Контекстне меню (також зване контекстним, ярликом і спливаючою або спливаючою меню) - це меню в графічному інтерфейсі користувача (GUI), яке з'являється при взаємодії з користувачем, наприклад, при клацанні правою кнопкою миші.
Де моє меню?
На головному екрані проведіть вгору або натисніть кнопку Всі програми, який доступний на більшості смартфонів Android, для доступу до екрана "Всі програми". Коли ви опинитеся на екрані «Всі програми», знайдіть програму «Параметри» та натисніть на неї. Його значок виглядає як зубчасте колесо. Відкриється меню налаштувань Android.
Як знайти приховані налаштування на Android?
У верхньому правому кутку ви повинні побачити крихітну шестерню з налаштуваннями. Натисніть та утримуйте цей маленький значок близько п'яти секунд, щоб відкрити System UI Tuner.. Ви отримаєте повідомлення про те, що прихована функція була додана до ваших налаштувань, як тільки ви відпустите значок шестерні.