A1-A2


Меню. Определение меню в файле xml, вложенное меню. Программное создание меню. Группы меню, порядок элементов в меню - order. Создание контекстного меню. Практика
Определение меню в файле xml
Использовать ресурсы меню рекомендуется по нескольким причинам:
в XML проще визуализировать структуру меню;
это позволяет отделить контент для меню от кода, определяющего работу приложения;
это позволяет создавать альтернативные варианты меню для разных версий платформы, размеров экрана и других конфигураций путем использования структуры ресурсов приложения.
1 пример
Создаем папку menu в res – New > Android Recourse Directory (Resource type - menu)
В папке res/menu создаем файл newmenu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu
    xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/menu_add"
        android:title="add">
    </item>
    <item
        android:id="@+id/menu_edit"
        android:title="edit">
    </item>
    <item
        android:id="@+id/menu_delete"
        android:orderInCategory="3"
        android:title="delete">
    </item>
    <group
        android:id="@+id/group1">
        <item
            android:id="@+id/menu_copy"
            android:orderInCategory="1"
            android:title="copy">
        </item>
        <item
            android:id="@+id/menu_paste"
            android:orderInCategory="2"
            android:title="paste">
        </item>
        <item
            android:id="@+id/menu_exit"
            android:orderInCategory="4"
            android:title="exit">
        </item>
    </group>
</menu>
<menu> - Определяет класс Menu, который является контейнером для пунктов меню. Элемент <menu> содержит один или несколько элементов <item> и <group>.
<item> - Создает класс MenuItem, который представляет один пункт меню. Этот элемент может содержать вложенный элемент <menu> для создания вложенных меню.
<group> - Необязательный, невидимый контейнер для элементов item. Он позволяет разделять пункты меню на категории и назначать им одинаковые свойства, такие как активное состояние и видимость. Подробные сведения изложены в разделе
Атрибут orderInCategory - это порядок пунктов, а title - текст.
В методе onCreateOptionsMenu свяжем menu и xml-файл:
public boolean onCreateOptionsMenu(Menu menu) {
  getMenuInflater().inflate(R.menu.newmenu, menu);
  return super.onCreateOptionsMenu(menu);
}
С помощью метода getMenuInflater получаем MenuInflater и вызываем его метод inflate. На вход передаем файл newmenu.xml из папки res/menu и объект menu. MenuInflater берет объект menu и наполняет его пунктами согласно файлу newmenu.xml.
2 пример
<?xml version="1.0" encoding="utf-8"?><menu xmlns:android="http://schemas.android.com/apk/res/android">    <item android:id="@+id/new_game"          android:icon="@drawable/ic_new_game"          android:title="@string/new_game"          android:showAsAction="ifRoom"/>    <item android:id="@+id/help"          android:icon="@drawable/ic_help"          android:title="@string/help" /></menu>
Пункты приведенного выше меню имеют следующие атрибуты:
android:id - Идентификатор ресурса, который является уникальным для этого пункта, что позволяет приложению распознавать пункт, когда его выбирает пользователь.
android:icon - Ссылка на графический элемент, который будет использоваться в качестве значка пункта меню.

android:title - Ссылка на строку, которая будет использоваться в качестве названия пункта меню.
android:showAsAction - Указывает, когда и как этот пункт должен отображаться в строке действий:
android:showAsAction=
["ifRoom" | "never" | "withText" | "always" | "collapseActionView"]
never – не показывать элемент
ifRoom – показывать, если есть место
always – всегда показывать
withText - Актуально для элементов с указанной иконкой. В этом случае для элемента будет показана не только иконка, но и текст из title. 
Другие атрибуты меню:https://developer.android.com/guide/topics/resources/menu-resource.html2

Вложенное меню
К пункту любого меню (кроме вложенного меню) можно прикрепить вложенное меню.
Вложенные меню полезны, когда в приложении имеется множество функций, которые можно разделить на категории подобно строке меню приложения для ПК ("Файл", "Правка", "Вид" и т. д.).
3 пример
<?xml version="1.0" encoding="utf-8"?><menu xmlns:android="http://schemas.android.com/apk/res/android">    <item android:id="@+id/file"          android:title="@string/file" >        <!-- "file" submenu -->        <menu>            <item android:id="@+id/create_new"                  android:title="@string/create_new" />            <item android:id="@+id/open"                  android:title="@string/open" />        </menu>    </item></menu>

Программное создание меню
4 пример
1) За создание меню отвечает метод onCreateOptionsMenu. На вход ему подается объект типа Menu, 
Добавляем пункты методом add(CharSequence title). На вход методу add подается текст пункта меню.
public boolean onCreateOptionsMenu(Menu menu) {
   
  menu.add("О программе");
  menu.add("Уведомления");
  menu.add("Справка");
  menu.add("Настройки");
   
  return super.onCreateOptionsMenu(menu);
}
Метод onCreateOptionsMenu должен вернуть результат типа boolean. True – меню показывать, False – не показывать. По умолчанию true.
2) Реализуем нажатие на пункты. Обработчиком является Activity, метод onOptionsItemSelected.
На вход ему передается пункт меню, который был нажат – MenuItem. Определить, какое именно меню было нажато можно по методу getTitle. Давайте выводить всплывающее сообщение с текстом нажатого пункта меню:
public boolean onOptionsItemSelected(MenuItem item) {
  Toast.makeText(this, item.getTitle(), Toast.LENGTH_SHORT).show();
  return super.onOptionsItemSelected(item);
}

Группы меню, порядок элементов в меню – order
5 пример
1) Рассмотрим другую реализацию метода add(int groupId, int itemId, int order, CharSequence title). У этого метода 4 параметра на вход: 
- groupId - идентификатор группы, частью которой является пункт меню- itemId - ID пункта меню- order - для задания последовательности показа пунктов меню- title - текст, который будет отображен
Добавим на экран TextView и CheckBox:- TextView будет отображать какой пункт меню был выбран- CheckBox будет определять показывать обычное меню или расширенное. Это будет реализовано с помощью групп меню.
Открываем xml присвоим ID существующему TextView, сотрем его текст и создадим CheckBox
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/textView">
    </TextView>
    <CheckBox
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/chbExtMenu"
        android:text="расширенное меню">
    </CheckBox>
Java
// Элементы экрана
  TextView tv;
  CheckBox chb;
// находим элементы
  tv = (TextView) findViewById(R.id.textView);
  chb = (CheckBox) findViewById(R.id.chbExtMenu);
onCreateOptionsMenu - вызывается только при первом показе меню. Создает меню и более не используется. Здесь мы добавляем к меню пункты.
// создание меню
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
      // добавляем пункты меню
      menu.add(0, 1, 0, "add");
      menu.add(0, 2, 0, "edit");
      menu.add(0, 3, 3, "delete");
      menu.add(1, 4, 1, "copy");
      menu.add(1, 5, 2, "paste");
      menu.add(1, 6, 4, "settings");
      menu.add(1, 7, 7, "notif");
      menu.add(1, 8, 9, "about");
      menu.add(1, 9, 8, "faq");
      return super.onCreateOptionsMenu(menu);
    }
Первый параметр – ID группы. В первых трех пунктах он равен нулю, в оставшихся трех – 1. Т.е. пункты меню copy, paste и exit объединены в группу с ID = 1. ID группы мы будем использовать в реализации onPrepareOptionsMenu.
Второй параметр – ID пункта меню. В обработчике используется для определения какой пункт меню был нажат. Будем использовать его в onOptionsItemSelected.
Третий параметр – определяет позицию пункта меню. Этот параметр используется для определения порядка пунктов при отображении меню. Используется сортировка по возрастанию. Если order у нескольких пунктов совпадает, то эти пункты размещаются в порядке их создания в методе onCreateOptionsMenu
Четвертый параметр – текст, который будет отображаться на пункте меню.
2) onPrepareOptionsMenu - вызывается каждый раз перед отображением меню. Здесь мы вносим изменения в уже созданное меню, если это необходимо
// обновление меню
    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
      // пункты меню с ID группы = 1 видны, если в CheckBox стоит галка
      menu.setGroupVisible(1, chb.isChecked());
      return super.onPrepareOptionsMenu(menu);
    }
В метод onPrepareOptionsMenu передается объект Menu и мы можем работать с ним. В данном примере вызываем setGroupVisible. Этот метод позволяет скрывать\отображать пункты меню. На вход подается два параметра – ID группы и boolean-значение. В качестве ID группы мы пишем – 1 (та самая группа с ID = 1, в которой находятся пункты copy, paste и exit), а в качестве boolean параметра используем состояние CheckBox. Если он включен, то пункты меню (из группы с ID = 1) будут отображаться, если выключен – не будут
3) onOptionsItemSelected - вызывается при нажатии пункта меню. Здесь мы определяем какой пункт меню был нажат.
// обработка нажатий
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
      
StringBuilder sb = new StringBuilder();
 
      // Выведем в TextView информацию о нажатом пункте меню
      sb.append("Item Menu");
      sb.append("\r\n groupId: " + String.valueOf(item.getGroupId()));
      sb.append("\r\n itemId: " + String.valueOf(item.getItemId()));
      sb.append("\r\n order: " + String.valueOf(item.getOrder()));
      sb.append("\r\n title: " + item.getTitle());
      tv.setText(sb.toString());
       
      return super.onOptionsItemSelected(item);
    }

Создание контекстного меню
Контекстное меню вызывается в Андроид длительным нажатием на каком-либо экранном компоненте. Обычно оно используется в списках.
6 пример
1) Нарисуем два TextView:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <TextView
        android:layout_height="wrap_content"
        android:textSize="26sp"
        android:layout_width="wrap_content"
        android:id="@+id/tvColor"
        android:layout_marginBottom="50dp"
        android:layout_marginTop="50dp"
        android:text="Text color">
    </TextView>
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textSize="22sp"
        android:id="@+id/tvSize"
        android:text="Text size">
    </TextView>
</LinearLayout>
Для первого TextView мы сделаем контекстное меню, с помощью которого будем менять цвет текста. Для второго – будем менять размер текста.
Принцип создания контекстного меню похож на создание обычного меню.
Метод создания onCreateContextMenu вызывается каждый раз перед показом меню. На вход ему передается:
- ContextMenu, в который мы будем добавлять пункты- View - элемент экрана, для которого вызвано контекстное меню- ContextMenu.ContextMenuInfo – содержит доп.информацию, когда контекстное меню вызвано для элемента списка.
Метод обработки onContextItemSelected аналогичный методу onOptionsItemSelected для обычного меню. На вход передается MenuItem – пункт меню, который был нажат.
 
Также нам понадобится третий метод registerForContextMenu. На вход ему передается View и это означает, что для этой View необходимо создавать контекстное меню. Если не выполнить этот метод, контекстное меню для View создаваться не будет.
Java
TextView tvColor, tvSize;
tvColor = (TextView) findViewById(R.id.tvColor);
tvSize = (TextView) findViewById(R.id.tvSize);
       
registerForContextMenu(tvColor);
registerForContextMenu(tvSize);
Используем константы для хранения ID пунктов меню:
final int MENU_COLOR_RED = 1;
final int MENU_COLOR_GREEN = 2;
final int MENU_COLOR_BLUE = 3;
 
final int MENU_SIZE_22 = 4;
final int MENU_SIZE_26 = 5;
final int MENU_SIZE_30 = 6;
Создаем контекстное меню:
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
    ContextMenuInfo menuInfo) {
    switch (v.getId()) {
case R.id.tvColor:
  menu.add(0, MENU_COLOR_RED, 0, "Red");
  menu.add(0, MENU_COLOR_GREEN, 0, "Green");
  menu.add(0, MENU_COLOR_BLUE, 0, "Blue");
  break;
case R.id.tvSize:
  menu.add(0, MENU_SIZE_22, 0, "22");
  menu.add(0, MENU_SIZE_26, 0, "26");
  menu.add(0, MENU_SIZE_30, 0, "30");
  break;
}
}
По ID определяем View, для которого вызвано контекстное меню и в зависимости от этого создаем определенное меню. Т.е. если контекстное меню вызвано для tvColor, то мы создаем меню с перечислением цветов, а если для tvSize – с размерами шрифта.
2) Обработка нажатий:
@Override
public boolean onContextItemSelected(MenuItem item) {
  switch (item.getItemId()) {
  // пункты меню для tvColor
case MENU_COLOR_RED:
  tvColor.setTextColor(Color.RED);
  tvColor.setText("Text color = red");
  break;
case MENU_COLOR_GREEN:
  tvColor.setTextColor(Color.GREEN);
  tvColor.setText("Text color = green");
  break;
case MENU_COLOR_BLUE:
  tvColor.setTextColor(Color.BLUE);
  tvColor.setText("Text color = blue");
  break;
// пункты меню для tvSize
case MENU_SIZE_22:
  tvSize.setTextSize(22);
  tvSize.setText("Text size = 22");
  break;
case MENU_SIZE_26:
  tvSize.setTextSize(26);
  tvSize.setText("Text size = 26");
  break;
case MENU_SIZE_30:
  tvSize.setTextSize(30);
  tvSize.setText("Text size = 30");
  break;
  }
  return super.onContextItemSelected(item);
}
В этом методе мы определяем по ID, какой пункт меню был нажат. И выполняем соответствующие действия: меняем цвет текста для tvColor или размер шрифта для tvSize.

Практика
Создать вложенное меню с элементами меню в xml. Title пунктов определить через строковые переменные.
Элементы меню расположить в xml так же как они расологаются в задании, а выводить на экран в соотвествии заданому порядку в скобках.
Пункты «История» и «Избранное» объединить в группу и реализовать ее скрытие используя чекбокс.
Настройки (2)
Цвет
Язык
Уведомления
О программе (3)
Избранное (1)
История (0)

Приложенные файлы

  • docx 22549493
    Размер файла: 3 MB Загрузок: 1

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