Menu

Submitted by gary on Sun, 02/03/2013 - 01:00

Є кілька способі створити меню:
1.

public boolean onCreateOptionsMenu(Menu menu) {
  // TODO Auto-generated method stub

  menu.add("menu1");
  menu.add("menu2");
  menu.add("menu3");
  menu.add("menu4");
 
  return super.onCreateOptionsMenu(menu);
}

Цей спосіб дуже примітивний і не зручний, адже визначати обраний пункт меню ми можемо лише те текстом

public boolean onOptionsItemSelected(MenuItem item) {
  // TODO Auto-generated method stub
  Toast.makeText(this, item.getTitle(), Toast.LENGTH_SHORT).show();
  return super.onOptionsItemSelected(item);
}

2.

    public boolean onCreateOptionsMenu(Menu menu) {
      // TODO Auto-generated method stub
      // добавляем пункты меню
      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, "exit");
     
      return super.onCreateOptionsMenu(menu);
    }

.add(int groupId, int itemId, int order, CharSequence title).
    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
      // TODO Auto-generated method stub
      // пункти меню з ID групи = 1 видимі, якщо в CheckBox стоїть галка
      menu.setGroupVisible(1, chb.isChecked());
      return super.onPrepareOptionsMenu(menu);
    }

    // обробка натиснень
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
      // TODO Auto-generated method stub
      StringBuilder sb = new StringBuilder();

      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);
    }

Використані методи:
onCreateOptionsMenu - викликається при першому показі меню. Тут додаємо до меню пункти
onPrepareOptionsMenu - викликається кожен раз перед виведенням меню. тут можна редагувати вже створене меню
onOptionsItemSelected - викликається при натисненні на пункт меню

3. 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>

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

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

  public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.mymenu, menu);
    return super.onCreateOptionsMenu(menu);
  }

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

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