バラエティに富んだメニューを(3) - メニューに関するメソッドのあれこれ
Activityクラスでは、メニューに関するメソッドがいろいろと用意されている。
イベントメソッドの実行順序
以下のプログラムを使って、メニューに関するイベントがどのような順序で駆動されるか調べてみた。
メニュープログラム5(MenuSample5.java)
オプションメニューのイベント
このプログラムを起動して、オプションメニューを表示、menuItem1を選択した後、 もう1回オプションメニューを表示して、今度はmenuItem2を選択した時の、ログの出力を以下に示す。
オプションメニューのonCreateOptionsMenuメソッドとonPrepareOptionsMenuメソッドの関係
オプションメニューでは、最初にメニューを表示する時にonCreateOptionsMenuメソッドが呼ばれ、次に onPrepareOptionsMenuメソッドが呼ばれる。
2回目以降、メニューを表示する時にはonCreateOptionsMenuメソッドは呼ばれず、 onPrepareOptionsMenuメソッドのみが呼ばれる。
onCreateOptionsMenuメソッドで最初に作成したメニューを、 メニューが表示される直前に変更したい場合には、onPrepareOptionsMenuメソッド内にそのコードを記述すると良いことがわかる。オプションメニューが選択された時のイベント
オプションメニューが選択された時には、まずonMenuItemSelectedが呼ばれ、 次にonOptionsItemSelectedが呼ばれる。
このプログラムでは、onMenuItemSelectedメソッド内で親クラスのonMenuItemSelectedを実行(64行目)しているので、 次のonOptionsItemSelectedメソッドが呼び出されているが、 これをおこなわないとonOptionsItemSelectedメソッドは呼び出されなくなる。
また、setOnMenuItemClickListenerを使って、メニュー項目に新たなイベントリスナーを指定する(75行目)と、 指定したイベントリスナーが最初に呼ばれる。
このイベントリスナーのonMenuItemClickメソッドの戻り値としてtrueを返すと、次のonMenuItemSelectedメソッドと onOptionsItemSelectedメソッドは呼ばれなくなる。
onMenuItemSelectedメソッドは、オプションメニューが選択された時だけでなく、コンテキストメニューが選択された時にも呼び出される。オプションメニューとコンテキストメニューが選択された時の両方の処理を、同じメソッド内でおこないたい場合はこのメソッドを使用すると便利である。
また、特定のメニューが選択された場合のみ処理をおこないたい場合は、setOnMenuItemClickListenerメソッドを利用してイベントリスナーを指定すれば良い。
コンテキストメニューのイベント
今度は、コンテキストメニューの挙動を調べてみる。
このプログラムを起動し直して、 コンテキストメニューを表示してmenuItem1を選択した後、もう1回コンテキストメニューを表示して、 今度はmenuItem2を選択した時の、ログの出力を以下に示す。
コンテキストメニューのonCreateContextMenuメソッドのふるまい
オプションメニューと異なり、コンテキストメニューにはonPrepareContextMenuメソッドは存在しない。
コンテキストメニューが表示される前には、毎回onCreateContextMenuメソッドが呼ばる。
メニューの表示が終了すると、作成されたメニューは廃棄されて、再度メニューを表示する時にはもう一度onCreateContextMenuメソッドが呼ばれ、 新たにメニューを作成し直すようだ。
コンテキストメニューが選択された時のイベント
118行目でオプションメニューと同じように、menuItem2にsetOnMenuItemClickListenerで新たなイベントリスナーを指定している。
コンテキストメニューが選択された時のふるまいは、onOptionsItemSelectedがonContextItemSelectedに変わるだけで オプションメニューのぶるまいと同じである。
メニューオープン時のメソッド
メソッドの名前から判断してonMenuOpenedメソッドはオプションメニューとコンテキストメニューの両方で 実行されると思っていたが、予測に反してオプションメニューを表示する時にしか実行されない。
メニューを操作するメソッド
アクティビティからメニューを操作するメソッドには、以下のものがある。
- void openOptionsMenu()
プログラムからオプションメニューを表示するには、このメソッドを実行する。
メニュープログラム5の46行目のコメントをはずして、プログラムを実行してボタンを押すと、オプションメニューが表示されるようになる。 - void openContextMenu(View view)
プログラムからコンテキストメニューを表示するにはこのメソッドを実行する。
メニュープログラム5の47行目のコメントをはずして、プログラムを実行してボタンを押すと、コンテキストメニューが表示されるようになります。 - void registerForContextMenu(View view)
Viewオブジェクトとコンテキストメニューを結びつけます。
このメソッドを実行しないと、コンテキストメニューは表示されません。 - void unregisterForContextMenu(View view)
Viewオブジェクトをコンテキストメニューから引き離して、長押ししてもコンテキストメニューが表示されないようにします。
メニュープログラム5の48行目のコメントをはずして、プログラムを実行してボタンを長押ししてもコンテキストメニューが表示されなくなります。