mucchinのAndroid戦記

Androidアプリにオプションメニューを設定する方法

Androidアプリに、オプションメニューを設定する方法は?

Androidアプリ実行中に、端末のMenuボタンを押す事で現れるオプションメニューがあります。
例えば、「終了」とか「保存」とか、そのアプリがよく使うであろう処理を実装すれば、ユーザビリティの向上に役立ちます。
このオプションメニューを実装する方法を紹介します。


二通り紹介します。
一つは、メニューを静的(アプリの状態に応じてメニューを変えたりしなくてもよい)とする場合と、アプリの状態に応じてメニューを動的に変更したい!という場合の2通りを紹介します。

静的なオプションメニュー

オプションメニューが静的でいい場合は、Activity生成時に一度だけ呼び出されるonCreateOptionsMenu()を実装します。
例としては、以下のようになります。


public boolean onCreateOptionsMenu(Menu menu) {
   boolean ret = super.onCreateOptionsMenu(menu);

   menu.add(0 , Menu.FIRST , Menu.NONE , “メニュー1”);
   menu.add(0 , Menu.FIRST + 1 ,Menu.NONE , “メニュー2”);

   return ret;
}


1行目は、スーパークラス(Activity)のonCreateOptionMenu()をコールしています。
位置は、menu.add()の下でもよさそうでしたし、逆にコールしなくても動きました・・・。
その他のonCreate()等では、最初に呼ばないとダメだったんですが。

menu.add()の引数の説明をします。

第一引数はグループID、第二引数はアイテムIDとなります。
用途は、どちらも同じような意味合いです。
後述しますが、メニューが選択された場合に実行されるイベント内で、どのメニューが押されたのかを判別するときの情報になります。

第三引数は、メニューの表示順序です。
Menu.NONEは「0」です。
同じ値が設定された場合は、設定した順にメニューが並ぶようですので、設定した順番でいい場合は、全てMenu.NONE、もしくは0でいいでしょう。

第四引数は、メニューに表示する文言です。
上記の例では、ベタ書きですが、通常は文字列リソースを指定するといいでしょう。
ちなみに、先ほどの例を実装したAndroidアプリを起動し、端末のMenuボタンを押すと、以下のような画面が表示されます。


スポンサーリンク




動的なオプションメニュー

先ほどは、onCreateOptionsMenu()を使いましたが、動的にメニューを変えたい場合は、onPrepareOptionsMenu()を使用します。
onCreateOptionsMenu()がActivity生成時のみに実行されるのに対し、このonPrepareOptionsMenu()は、メニューの表示の都度に実行されます。
実装方法は先ほどのonCreateOptionsMenu()と同じです。
何かメニューを変えたいフラグなど用意して、処理を振り分けるだけです。


オプションメニューが押された場合

オプションメニューを開き、何らかのメニューが実行されると、onOptionsItemSelected()が呼び出されます。


public boolean onOptionsItemSelected(MenuItem item) {
   System.out.println(item.getGroupId());
   System.out.println(item.getItemId());
   return super.onOptionsItemSelected(item);
}
引数に、MenuItem型のインスタンスが格納されています。
どのメニューが押されたのかは、このインスタンスのgetGroupId()とgetItemId()で判定する事が可能です。
これには、先ほどのmenu.add()の第一引数と第二引数で指定した値が入っています。
グループIDを複数持たせない場合は、アイテムIDのみで判定してもいいと思います。
上記の例は、ただ単に押されたメニューのグループID、アイテムIDをログに出力する、という事をしているだけです。

今回は以上です。