バラエティに富んだメニューを(1) - 「オプションメニュー」と「コンテキストメニュー」
アンドロイドのメニューには大きく分けて「オプションメニュー」と「コンテキストメニュー」とがある。
オプションメニュー
オプションメニューは、MENUキーを押す事で表示されるメニューである。
まず、オプションメニューを表示する簡単なプログラムの例を以下に示す。
メニュープログラム1(MenuSample1.java)
プログラムを起動して、MENUキーを押すと、画面の下部に以下のようにメニューが表示される。
メニュー項目を選択すると、ボタンのテキストにメニューのタイトルが表示される。
メニューを作成時に呼ばれるonCreateOptionsMenuメソッド
オプションメニューを表示するには、まずonCreateOptionsMenuメソッドをオーバーライトして、 このメソッド内にメニューを作成するコ-ドを記述する。
メソッドの引数としてに渡されるMenuオブジェクトに、addメソッドを使ってメニュー項目を追加する。
addメソッドには、以下のようにオーバーライトされたメソッドが存在する。
- add(int groupId, int itemId, int order, CharSequence title)
メニューのグループID,メニューのID,メニューの表示順,メニューの表示タイトルを指定してメニュー項目を追加する。
グループIDについては「メニューグループ」を参照。 - add(int groupId, int itemId, int order, int titleRes)
1と同じであるが、メニューのタイトルの指定に文字列リソースのIDを指定するところが異なる。 - add(CharSequence title)
メニューの表示タイトル(文字列)のみを指定 - add(int titleRes)
xmlリソースファイルよりメニューを追加する。
「xmlリソースファイルでメニューを定義する」を参照
3のメソッドの場合は、メニューのタイトルのみしか指定できないので、 どの項目が押されたかを識別するには、addメソッドの戻り値であるMenuItemオブジェクトを保存しておくか、 getTitleメソドより戻されるメニューのタイトルで判断するなりの工夫を要する。
プログラムの32,33行目で、メニューのグループIDとメニューの表示順を指定するのに使われている定数「Menu.NONE」は、 グループや表示順を特に指定しない場合に使われる。
また,11,12行目で使われている定数「Menu.FIRST」は 、最初のグループIDやメニューIDである事を示すために使われる。
onCreateOptionsMenuメソッドの戻り値は、メニューを表示するかどうかを示す論理値を返す。
もし、ここでfalseを返すと、メニューは表示されない。
メニュー選択時に呼ばれるonOptionsItemSelectedメソッド
メニュー項目が選択されると、onOptionsItemSelectedメソッドが呼ばれる。
このメソッドをオーバライトして、メニューが押された時の処理を記述する。
通常は、このプログラムのようにgetItemIdメソッドよりメニュー項目のIDを取得して、IDの値に応じて処理に分岐する。
onOptionsItemSelectedメソッドの戻り値の意味はよくわからないが、選択の処理が完了した場合にはtrueを、 デフォルトのメニューの処理を実行する場合にはfalseを返す、ようなことがリファレンスには書いてある。
とりあえずtrueを指定しておけば、よいようだ。
コンテキストメニュー
コンテキストメニューは、ウィジェットに応じて変化するメニューです。
Windowsパソコンの右クリックメニューに相等します。
アンドロイドでは、ウィジェットの上で長押しする事で、ウィジェットに関連付けられたコンテキストメニューを表示する事ができます。
コンテキストメニューのプログラムの例を以下に示します。
メニュープログラム2(MenuSample2.java)
このプログラムを実行して、ボタン1を長押しすると以下のようなメニューが、
また一方、ボタン2を長押しすると、以下のようなメニューが表示されます。
オプションメニューのメソッドとコンテキストメニューのメソッドは、似たようなメソッドが使われます。
コンテキストメニューでは、メニューを作成するときのイベントメソッドとして、onCreateOptionsMenuでは無くonCreateContextMenuメソッドが、 メニュー項目が選択された時のイベントメソッドとして、onOptionsItemSelectedメソッドでは無くonContextItemSelectedが呼ばれます。
メニューを作成する方法,メニューが選択された時に選択されたメニュー項目を判断する方法は、オプションメニューでのやり方と同じです。
onCreateContextMenuメソッドの引数には、Viewオブジェクトが渡されるのでこれを利用して、ウィジェットに応じて表示するメニューを切り替える事ができます。
また、コンテキストメニューの場合には、registerForContextMenuメソッドを使用して、コンテキストメニューの対象となるウィジェットを指定する必要があります。
細かい点ですが、onCreateContextMenuメソッドはonCreateOptionsMenuと異なり、戻り値はありません。
onContextItemSelectedの戻り値の意味は、onOptionsItemSelectedメソッドと同じです。参考URL
次回とりあげるサブメニューやメニューアイコンも含め、メニュー関係の参考URLを、以下にあげておきます。- Android Developers
- 開発ガイド
- リファレンス
- Taosoftware-Android メニューアイコン
標準で用意されている、 R.drawableクラスの定数に対応する、メニューアイコンの画像が参照できます。