Android – Options Menuの使い方(コード編)

ActivityでMenuボタンを押したときのメニューはOptions Menuと言います。

これの使い方メモ

メニューそのものを作るのは簡単で、ActivityのonCreateOptionsMenuをOverrideしてそこでメニューを作ってやるだけ。

最後にtrueを返すことでMenu KeyによってMenuが表示されるようになります。

@Override
public boolean onCreateOptionsMenu(Menu menu) {
  MenuItem menuItem = menu.add(0, R.string.main_menu_preferences, 0, R.string.main_menu_preferences);
  menuItem.setIcon(android.R.drawable.ic_menu_preferences);
  return true;
}

menuへの追加はadd(int groupId, int itemId, int order, int titleRes)でやるのが一般的な方法だと思う。

groupIdはMenuの状態変更をまとめてやりたい場合に設定する。Menu.setGroupXXXXってMethodが用意されてる。普通はMenu.NONE=0で良いぽ。

itemIdはmenuが選択されたときに、どのmenuが選択されたのかを判断するためのuniqueな番号。例だとstring resourceのidをそのまま使っちゃってます。識別さえ出来れば良いので適当に(XMLでitemを定義する場合は@+id/xxxxx_xxxxx_menuとかでIDを作成すれば良いです)。

次がorder。表示の順番の指定。これも特に意識しないのであればMenu.NONEで指定すれば最後に追加されます。

最後が文字列リソースの番号。表示文字列のリソースID。

アイコンの設定はaddしたあとに戻るMenuItemに対してsetIconする。

このときにandroid.R.drawable.ic_menu_xxxxxxxxにいろいろあるので使える。

普通の用途ならこれで十分じゃないかな。

一応、ここで渡されるMenu Objectはあとで状態変更したりするときに使って良いみたい。onCreateOptionsMenuがもう一度呼び出されない限りってSDKにあるけど、このonCreateOptionsMenuそのものが一度しか呼ばれない。って書いてあるんだけど、、、?まぁあんまり気にしなくて良いって事かな。

続いてメニューをユーザが選択したときの処理方法。

こちらもonOptionsItemSelected(MenuItem item)をOverrideするだけ。

@Override
public boolean onOptionsItemSelected(MenuItem item) {
  switch(item.getItemId()) {
  case R.string.main_menu_preferences:
    Intent intent = new Intent(this, AppPreferenceActivity.class);
    startActivity(intent);
    return true;
  default:
    break;
  }
  return false;
}

とか、こんな感じ。こちらは説明いらないか。

Menuを処理したらtrueを返す。そんな感じ。

あと多分知っておいたほうが良いこと二点ほど。

メニューの状態(enable/disable)を条件によって変えたい場合。onPrepareOptionsMenuという関数があって、こちらはOptionsメニューが表示される度に呼ばれるので、状態によって特定のMenuをDisableにしたい場合はこちらをOverrideして操作をすれば良い。

Options Menuは6個以上に増えるとMore(日本語だと その他)ってアイコンが自動的に追加されて階層化されるようになるので、使用頻度の高いMenuは前のほうにもってくる。これは前述のorderを指定すれば良い。