バラエティに富んだメニューを(1) - 「オプションメニュー」と「コンテキストメニュー」


アンドロイドのメニューには大きく分けて「オプションメニュー」と「コンテキストメニュー」とがある。

オプションメニュー

オプションメニューは、MENUキーを押す事で表示されるメニューである。

まず、オプションメニューを表示する簡単なプログラムの例を以下に示す。

メニュープログラム1(MenuSample1.java)

プログラムを起動して、MENUキーを押すと、画面の下部に以下のようにメニューが表示される。

 

 

メニュー項目を選択すると、ボタンのテキストにメニューのタイトルが表示される。

メニューを作成時に呼ばれるonCreateOptionsMenuメソッド

オプションメニューを表示するには、まずonCreateOptionsMenuメソッドをオーバーライトして、 このメソッド内にメニューを作成するコ-ドを記述する。

メソッドの引数としてに渡されるMenuオブジェクトに、addメソッドを使ってメニュー項目を追加する。

addメソッドには、以下のようにオーバーライトされたメソッドが存在する。

  1. add(int groupId, int itemId, int order, CharSequence title)
    メニューのグループID,メニューのID,メニューの表示順,メニューの表示タイトルを指定してメニュー項目を追加する。
    グループIDについては「メニューグループ」を参照。
  2. add(int groupId, int itemId, int order, int titleRes)
    1と同じであるが、メニューのタイトルの指定に文字列リソースのIDを指定するところが異なる。
  3. add(CharSequence title)
    メニューの表示タイトル(文字列)のみを指定
  4. 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を、以下にあげておきます。

 

ページのトップへ戻る