Программирование Android Создание меню настроек программы Thu, November 21 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


Создание меню настроек программы Печать
Добавил(а) microsin   

В этой статье рассмотрен простейший пример создания меню опций (options menu настроек) для программы Android.

[Краткий обзор средств для создания меню опций]

В приложении Android меню опций (или меню настроек) программы вызывается, если нажать на левую системную кнопку на устройстве. По умолчанию при создании проекта приложения в Eclipse с помощью мастера (File -> New -> Android Application Project) создается простейшее меню опций с единственным пунктом Settings.

Android-default-empty-options-menu

При выборе пункта 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.

Eclipse-menu-editor

Имя свойства Описание
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.

Eclipse-create-submenu

Создастся подменю Sub-Menu.

3. Теперь нужно добавить элементы в подменю (Реле 0, Реле 1, ... Реле 29). Слева выберите элемент Sub-Menu, и нажмите кнопку Add..., снова должен быть выбран вариант "Create new element in the selected element", только теперь нужно кликнуть на Item, и кликнуть OK.

Eclipse-create-submenu-item

Создастся один пункт для подменю Item (с идентификатором item1). Отредактируйте у него следующие свойства:

Id @+id/relay000
Title Реле 0

Сохраните файл. Можно добавить остальные пункты подменю таким же способом, но удобнее сделать это в текстовом редакторе.

4. Переключитесь на нижнюю закладку редактора main.xml. Файл меню отобразится в текстовом редакторе, и будет иметь примерно такой вид:

< menu xmlns:android="http://schemas.android.com/apk/res/android" >
 < item
  android:id="@+id/action_settings"
  android:orderInCategory="100"
  android:showAsAction="never"
  android:title="@string/action_settings" >
     < menu >
         < item android:id="@+id/relay000" android:title="Реле 0"/ >
         
     < /menu >
 < /item >
< /menu >

Пункт подменю закодирован элементом item android:id="@+id/relay000" android:title="Реле 0". Добавьте методом копирования и вставки текста новые пункты подменю, исправив в них значение id и текст заголовка title.

Запустите программу на выполнение, нажав Ctrl+F11, и протестируйте, как работает созданное меню.

Android-simply-options-menu1 Android-simply-options-menu2

Пункты подменю можно прокручивать вверх и вниз, и легко выбирать нужный. Всю работу на себя берет 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.

 

Добавить комментарий


Защитный код
Обновить

Top of Page