Главная страница

моб разраб. Лабораторные работы с 1 по 21. Лабораторная работа Использование значений строк и цветов


Скачать 5.49 Mb.
НазваниеЛабораторная работа Использование значений строк и цветов
Анкормоб разраб
Дата05.03.2022
Размер5.49 Mb.
Формат файлаdocx
Имя файлаЛабораторные работы с 1 по 21.docx
ТипЛабораторная работа
#383909
страница17 из 20
1   ...   12   13   14   15   16   17   18   19   20

Меню в Android


Использование меню в приложениях позволяет сохранить ценное экранное пространство, которое в противном случае было бы занято относительно редко используемыми элементами пользовательского интерфейса.

Каждая Активность может иметь меню, реализующие специфические только для нее функции. Можно использовать также контекстные меню, индивидуальные для каждого Представления на экране.
Основы использования меню

В Android реализована поддержка трехступенчатой системы меню, оптимизированную, в первую очередь, для небольших экранов:

    • Основное меню возникает внизу на экране при нажатии на кнопку «menu» устройства. Оно может отображать текст и иконки для ограниченного (по умолчанию, не больше шести) числа пунктов. Для этого меню рекомендуется использовать иконки с цветовой гаммой в виде оттенков серого с элементами рельефности. Это меню не может содержать радиокнопки и чекбоксы. Если число пунктов такого меню превышает максимально допустимое значение, в меню автоматически появляется пункт с надписью «еще» more»). При нажатии на него отобразится Расширенноеменю.

    • Расширенное меню отображает прокручиваемый список, элементами которого являются пункты, не вошедшие в основное меню. В этом списке не могут отображаться иконки, но есть возможность отображения радиокнопок и чекбоксов. Поскольку не существует способа отобразить расширенноеменювместо основного, об изменении состояния каких-то компонентов приложения или системы рекомендуется уведомлять пользователя с помощью изменения иконок или текста пунктов меню.

    • Дочернее меню (меню третьего уровня) может быть вызвано из основного или расширенного меню и отображается во всплывающем окне. Вложенность не поддерживается, и попытка вызвать из дочернего еще одно меню приведет к выбросу исключения.


Создание меню

При обращении к меню вызывается метод onCreateOptionsMenu Активности и для появления меню на экране его требуется переопределить. Данный метод получает в качестве параметра объект класса Menu, который в дальнейшем используется для манипуляций с пунктами меню.

Для добавления новых пунктов в меню используется метод add объекта Menu со следующими параметрами:

    • Группа: для объединения пунктов меню для групповой обработки

    • Идентификатор: уникальный идентификатор пункта меню. Этот идентификатор передается обработчику нажатия на пункт меню – методу onOptionsItemSelected.

    • Порядок: значение, указывающее порядок, в котором пункты меню будут выводиться.

    • Текст: надпись на данном пункте меню.

После успешного создания меню метод onCreateOptionsMenu должен вернуть значение

true.

Пример показывает создание меню из трех пунктов с использованием строковых ресурсов:

@Override

public boolean onCreateOptionsMenu(Menu menu) {

super.onCreateOptionsMenu(menu);
menu.add(0, Menu.FIRST, Menu.NONE, R.string.menu_item1); menu.add(0, Menu.FIRST+1, Menu.NONE, R.string.menu_item2); menu.add(0, Menu.FIRST+2, Menu.NONE, R.string.menu_item3);
return true;

}
Для поиска пунктов меню по идентификатору можно использовать метод findItem объекта

Menu.

Параметры пунктов меню

Наиболее полезными параметрами пунктов меню являются следующие:

    • Краткие заголовки: используются в случае, если пункт может отобразиться в основном меню. Устанавливается методом setTitleCondensed объекта класса MenuItem:

menuItem.setTitleCondensed("заголовок");

    • Иконки: идентификатор Drawable, содержащий нужную картинку:

menuItem.setIcon(R.drawable.menu_item_icon);


    • Обработчик выбора пункта меню: установить можно, но не рекомендуется из соображений повышения производительности, лучше использовать обработчик всего меню (onOptionsItemSelected ). Тем не менее, пример:

menuItem.setOnMenuItemClickListener(new OnMenuItemClickListener() {

public boolean onMenuItemClick(MenuItem _menuItem) {

// обработать выбор пункта

return true;

}

});


    • Намерение: это намерение автоматически передается методу startActivity, если нажатие на пункт меню не было обработано обработчиками onMenuItemClickListener и onOptionsItemSelected:

menuItem.setIntent(new Intent(this, MyOtherActivity.class));

Динамическое изменение пунктов меню

Непосредственно перед выводом меню на экран вызывается метод onPrepareOptionsMenu текущей Активности, и переопределяя его можно динамически изменять состояние пунктов меню: разрешать/запрещать, делать невидимым, изменять текст и т. д.

Для поиска пункта меню, подлежащего модификации можно использовать метод findItem

объекта Menu, передаваемого в качестве параметра:

@Override

public boolean onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);

MenuItem menuItem = menu.findItem(MENU_ITEM);

//модифицировать пункт меню....

return true;
}


Обработка выбора пункта меню

Android позволяет обрабатывать все пункты меню (выбор их) одним обработчиком onOptionsItemSelected . Выбранный пункт меню передается этому обработчику в качестве объекта класса MenuItem.

Для реализации нужной реакции на выбор пункта меню требуется определить, что именно было выбрано. Для этого используется метод getItemId переданного в качестве параметра объекта, а полученный результат сравнивается с идентификаторами, использованными при добавлении пунктов в меню в методе onCreateOptionsMenu.

@Override

public boolean onOptionsItemSelected(MenuItem item) {

switch (item.getItemId()) {

// Проверить каждый известный пункт

case (MENU_ITEM):

// сделать что-то...

return true;

}

// Если пункт не обработан, отдаем обработку дальше

return super.onOptionsItemSelected(item);

}

Дочерниеиконтекстныеменю

При появлении на экране дочерние и контекстные меню выглядят одинаково, в виде плавающих окон, но при этом создаются по-разному.
Создание дочерних меню

Для создания дочерних меню используется метод addSubMenu объекта класса Menu:

SubMenu sub = menu.addSubMenu(0, 0, Menu.NONE, "дочернее меню"); sub.setHeaderIcon(R.drawable.icon);

sub.setIcon(R.drawable.icon);

MenuItem submenuItem = sub.add(0, 0, Menu.NONE, "пункт дочернего меню");
Как уже было сказано выше, вложенные дочерние меню Android не поддерживает.

Создание контекстных меню

Наиболее часто используемым способом создания контекстного меню в Android является переопределение метода onCreateContextMenu Активности:

@Override

public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {

super.onCreateContextMenu(menu, v, menuInfo);

menu.setHeaderTitle("Конекстное меню"); menu.add(0, Menu.FIRST, Menu.NONE, "Пункт 1"); menu.add(0, Menu.FIRST+1, Menu.NONE, "Пункт 2"); menu.add(0, Menu.FIRST+2, Menu.NONE, "Пункт 3");

}
Регистрация обработчика контекстного меню для нужных Представлений осуществляется с помощью метода Активности registerForContextMenu:

@Override

public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);
tv = (TextView) findViewById(R.id.text_view); registerForContextMenu(tv);

}
Пример обработчика:

@Override

public boolean onContextItemSelected(MenuItem item) {

switch (item.getItemId()) {

case DELETE_ID:

AdapterContextMenuInfo info = (AdapterContextMenuInfo) item

.getMenuInfo(); db.deleteItem(info.id); populate();

return true;

}

return super.onContextItemSelected(item);

}
Описание меню с помощью XML

Часто бывает удобнее всего описывать меню, в том числе иерархические, в виде ресурсов. О преимуществах такого подхода говорилось выше.

Меню традиционно описываются и хранятся в каталоге res/menu проекта. Все иерархии меню (если есть иерархические меню) должны находиться в отдельных файлах, а имя файла будет использовать как идентификатор ресурса. Корневым элементом файла должен быть тэг <menu>, а пункты меню описываются тэгом . Свойства пунктов меню

описываются соответствующими атрибутами:

"1.0" encoding="utf-8"?>

<menu xmlns:android="http://schemas.android.com/apk/res/android">

android:id="@+id/item01" android:icon="@drawable/menu_item" android:title="Пункт1">




android:id="@+id/item02" android:checkable="true" android:title="Пункт2">




android:id="@+id/item03" android:title="Пункт3">




android:id="@+id/item04" android:title="Дочернееменю1">




android:id="@+id/sub1item01" android:title="Пунктдочернегоменю1">








android:id="@+id/item05" android:title="Дочернееменю2">




android:id="@+id/sub2item01" android:title="Пунктдочернегоменю2">







Для создания объектов Menu из ресурсов в событий onCreateOptionsMenu и

onCreateContextMenu используется метод inflate объекта типа MenuInflater:

@Override

public boolean onCreateOptionsMenu(Menu menu) {

super.onCreateOptionsMenu(menu);
MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu1, menu);
return true;

}

или так:

@Override

public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {

super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu2, menu);
menu.setHeaderTitle("Контекстное меню");

}

Лабораторная работа «Создание и использование меню»

Модифицируйте проект MetroPicker следующим образом:

    1. Добавьте главное меню в Активность, отображающую список станций метро. В меню должен быть один пункт: «вернуться». Меню создайте динамически в коде, без использования строковых ресурсов.

    2. Динамически создайте контекстное меню для Представления TextView, отображающего выбранную станцию метро главной Активности. Выбор пункта меню должен сбрасывать выбранную станцию.

    3. Для главной Активности создайте основное меню из двух пунктов: «сбросить» и

«выйти». Реализуйте нужные функции при выборе этих пунктов.

    1. Повторите реализацию п.п. 1, 2 и 3 с помощью ресурсов, описывающих меню.

1   ...   12   13   14   15   16   17   18   19   20


написать администратору сайта