コンテキストメニュー
さて、もうひとつのメニューであるコンテキストメニューを紹介します。
コンテキストメニューの作り方
コンテキストメニューはリストビューなどを長押ししたときに下図のように表示されるメニューです。
といっても、作り方はオプションメニューと変わりません。menuフォルダにxmlファイルを作成し、アクティビティにonCreateContextMenu()メソッドを追加します。
今回は、menu_context_menu_list.xmlという名称でxmlファイルを追加します。xmlファイルの記述方法はオプションメニューと同じですので、ダウンロードサンプルの
res/menu/menu_context_menu_list.xml
を参照してください。ただし、showAsAction属性は使えませんので、注意してください。
onCreateContextMenu()メソッドに関しては、以下のソースコードを記述してください。
@Override public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, view, menuInfo); //(1) MenuInflater inflater = getMenuInflater(); //(2) inflater.inflate(R.menu.menu_context_menu_list, menu); //(3) menu.setHeaderTitle(R.string.menu_list_context_header); //(4) menu.setHeaderIcon(android.R.drawable.ic_menu_info_details); //(5) }
リスト7の(1)~(3)は定型処理です。
コンテキストメニューにヘッダータイトル文字列を指定する場合は、setHeaderTitle()メソッドを使います(リスト7の(4))。また、アイコンを指定する場合は、setHeaderIcon()メソッドを使います(リスト7の(5))。
最後に、onCreate()メソッド内末尾に以下の1行を追記してください。
registerForContextMenu(_lvMenu);
これは、コンテキストメニューを表示する画面部品を登録するメソッドです。この1行でListViewにコンテキストメニュー表示が登録されます。
コンテキストメニュー選択時の処理
コンテキストメニュー選択時の処理は、onContextItemSelected()メソッドに記述します。MenuListActivityに以下のメソッドを追加してください。
@Override public boolean onContextItemSelected(MenuItem item) { AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); //(1) int listPosition = info.position; //(2) Map<String, String> menu = _menuList.get(listPosition); //(3) int itemId = item.getItemId(); switch(itemId) { //(4) case R.id.menuListContextDesc: //(5) String desc = menu.get("desc"); Toast.makeText(MenuListActivity.this, desc, Toast.LENGTH_LONG).show(); break; case R.id.menuListContextOrder: //(6) // ここに注文処理を記述。 break; } return super.onContextItemSelected(item); }
基本の記述方法はonOptionsItemSelected()と変わりません。ただ、コンテキストメニューの場合は、リストビューのどの行をタップしたかの情報を取得する必要があります。それがリスト8の(1)と(2)です。これは、引数であるitemのgetMenuInfo()メソッドの戻り値をAdapterView.AdapterContextMenuInfo型にキャストすることで可能です。AdapterContextMenuInfoオブジェクトには、そのフィールドpositionにリストビューのどの行をタップしたかの値が格納されています。これを取り出しているのがリスト8の(2)であり、その値を使って、_menuListからメニュー情報のMapオブジェクトを取得しているのがリスト8の(3)です。
あとは、タップされた選択肢のR値に応じて、処理を分岐しています(リスト8の(4))。
リスト8の(5)ではメニューの説明がトーストで表示されるようにしています。
リスト8の(6)は注文処理になりますので、ListItemClickListenerクラスのonItemClick()メソッドと同じ内容となります。ただ、そうなると、ソースコードが重複してしまいます。そこで、ダウンロードサンプルでは、これをprivateメソッドorder()として、これを実行する形式になっています。
まとめ
今回は、Androidのメニューであるオプションメニューとコンテキストメニューを解説しました。
次回は、フラグメントを紹介します。