Урок 14

У цьому уроці ми:

- створюємо пункти меню c ID - групуємо та сортуємо пункти меню

Минулого уроку ми розглянули найпростіший спосіб створення меню методом add(CharSequence title), на вхід ми подавали лише текст. Розглянемо іншу реалізацію цього - add(int groupId, int itemId, int order, CharSequence title). Цей метод4 параметри на вхід: -groupId - ідентифікатор групи, частиною якої є пункт меню -itemId - ID пункту меню -order - для завдання послідовності показу пунктів меню -title - текст, який буде відображено

Щоб показати як застосовуються всі ці параметри, створимо додаток. На екрані будеTextView іCheckBox : - TextView буде відображати який пункт меню був вибраний - CheckBox визначатиме показувати звичайне меню або розширене. Це буде реалізовано за допомогою груп меню.

Відразу уточню, поняття "звичайне" та "розширене" - це не Андроїд-поняття, а просто мої назви. Тобто. коли запущено програму і користувач натискає кнопку меню, він бачить "звичайне" меню. Якщо ж він увімкне CheckBox, то буде відображатися "розширене" меню, в якому більше пунктів.

Project name : P0141_MenuAdvBuild Target : Android 2.3.3Application name : MenuAdvPackage name : ru.startandroid.develop.menuadvCreate Activity : MainActivity

Відкриємоmain.xml, надамоID існуючомуTextView, зітріть його текст і створимоCheckBox. Код:

version = "1.0" encoding = "utf-8" ?> xmlns:android = "http://schemas.android.com/apk/res/android" android:orientation = " vertical" android:layout_width = "fill_parent" android:layout_height = "fill_parent" > android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:id = "@+id/chbExtMenu" android:text = "розширене меню" >

android:layout_width = "fill_parent" android:layout_height = "wrap_content" android:id = "@+id/textView" >

ВідкриваємоMainActivity.java та класMainActivity заповнюємо наступним кодом:

Не забудьтеоновити імпорт (CTRL+SHIFT+O).

Давайте розбирати написане. Ми використовуємо такіметоди :

onCreateOptionsMenu - викликається тількипри першому показі меню. Створює меню та більше не використовується. Тут ми додаємо до меню пункти.

onPrepareOptionsMenu - викликаєтьсящоразу перед відображенням меню. Тут ми вносимо зміни до вже створеного меню, якщо це необхідно

onOptionsItemSelected - викликаєтьсяпри натисканні пункту меню. Тут ми визначаємо, який пункт меню був натиснутий.

У методіonCreateOptionsMenu ми додаємо 6 пунктів меню. Звернімо увагу до параметри методуAdd.

Перший параметр –>

Другий параметр –ID пункту меню. У обробнику використовується визначення який пункт меню був натиснутий. Будемо використовувати його уonOptionsItemSelected.

Третій параметр – визначаєпозицію пункту меню. Цей параметр використовується для визначення порядку пунктів під час відображення меню. Використовуєтьсясортування за зростанням, тобто. від меншогоorder до більшого.

Четвертий параметр –текст, який відображатиметься на пункті меню. Тут усе зрозуміло.

У методonPrepareOptionsMenu передається об'єктMenu і ми можемо працювати з ним. У цьому прикладі викликаємоsetGroupVisible. Цей метод дозволяєприховувати\відображати пункти меню. На вхід подається два параметри –>

Збережемо все і запустимо програму.

"Звичайне " меню:

урок

"Розширене " меню

меню

Залежно від стануCheckBox у меню видно3 або6 пунктів.

Зверніть увагу напорядок пунктів. Вони відсортовані за параметромorder позростанню. Якщоorder у кількох пунктівзбігається, то ці пункти розміщуютьсяу порядку їх створення у методі onCreateOptionsMenu.

При натисканні будь-якого пункту меню спрацьовує методonOptionsItemSelected. У ньому ми виводимо уTextView інформацію про натиснутий пункт. Можете звірити цю інформацію з тим, що ми кодували під час створення пунктів меню. Усі параметри мають збігатися. Порядок, для зручності, я зробив такий же, як і в методі add:groupId,itemId,order,title.

Спробуйте додати ще кілька пунктів у меню, щоб їх сталобільше шести. І зверніть увагу, як вони відобразяться.

Для спрощення коду я використовував безпосередньо цифри для ID груп та ID пунктів меню. А взагалі рекомендується використовувати константи, надалі використовуватиму їх.

Є ще один, зручніший і кращий спосіб створення меню - з використанням xml-файлів, аналогічно layout-файлам при створенні екрану. Щоб отримати меню, яке ми створювали програмно на цьому уроці, потрібно створити в папці res/menu файлmymenu.xml:

item- це пункт меню,group- група. У атрибутахIDвикористовуємо таку ж схему, як і в ID екранних компонентів, тобто. пишемо @+id/ і Eclipse сам створить ці ID у R.java. АтрибутorderInCategory- цепорядок пунктів, аtitle- текст.

У методіonCreateOptionsMenuнам тепер не треба вручну кодувати створення кожного пункту, ми просто зв'яжемо menu, яке нам дається на вхід і наш xml-файл.

За допомогою методуgetMenuInflaterми отримуємо MenuInflater і викликаємо його метод inflate. На вхід передаємо наш файлmymenu.xmlз папки res/menu та об'єктmenu. MenuInflater бере об'єкт menu та наповнює його пунктами відповідно до файлу mymenu.xml.

Якщо захочете приховати групу, виконуєте той самий метод setGroupVisible і передаєте туди R.id.group1 як ID групи.

Детально атрибути для xml-файлу меню можна переглянути тут.

Я вам рекомендую випробувати та потестити обидва способи створення меню. Програмне створення гнучкіше, а xml скорочує код.