コンテキストメニューを作る
AndroidのコンテキストメニューはWindowsの右クリックメニューと同じような機能です。今回はコンテキストメニューの設定方法について紹介します。
長押し操作(しばらくタップしつづけること)でメニューを表示できます。
ViewごとにContextMenuを登録することが可能です。一番ポピュラーな使われ方としてはListViewにコンテキストメニューを追加することです。リストビューの要素の追加、変更、削除など編集操作用にコンテキストメニューを用意すれば、直感的でわかりやすいUIになります。
以下の手順でコンテキストメニューを作成します。
- コンテキストメニューを表示するViewを登録する
- メニューを作成する
- 選択されたときのアクションコードを記述する
ContextMenuの関連メソッド
大事なメソッド・クラス | 説明 |
---|---|
Activity#registerForContextMenu | コンテキストメニューの登録 |
Activity#onCreateContextMenu | コンテキストメニューの作成 |
ContextMenu#setHeaderTitle | メニュータイトル |
ContextMenu#add | メニュー追加 |
AdapterContextMenuInfoクラス | コンテキストメニューの付加情報 |
コンテキストメニューはアイコン表示やショートカットキーによる操作をサポートしていない、など機能に制限があります。写真を見てもわかるように、シンプルな補助メニューという位置づけです。
サンプルコードは続きから
1.コンテキストメニューを表示するViewを登録する
1 2 3 4 5 6 7 8 9 10 | @Override public void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.main); TextView tv = (TextView)findViewById(R.id.textview); //Viewに追加する場合、registerForContextMenu(View);が必要 registerForContextMenu(tv); } |
サンプルコード9行目でregisterForContextMenu(View v)をつかってコンテキストメニューを表示するViewを登録しました。
どんな種類のViewでもコンテキストメニューを持つことができます。
layout/main.xml
1 2 3 4 5 6 7 8 9 10 11 12 | <? xml version = "1.0" encoding = "utf-8" ?> android:orientation = "vertical" android:layout_width = "fill_parent" android:layout_height = "fill_parent" > < TextView android:id = "@+id/textview" android:layout_width = "fill_parent" android:text = "@string/hello" android:layout_height = "match_parent" /> </ LinearLayout > |
2.メニューを作成する
つづいてonCreateContextMenuメソッドでコンテキストメニューで表示する中身を作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | static final int CONTEXT_MENU1_ID = 0 ; static final int CONTEXT_MENU2_ID = 1 ; @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { super .onCreateContextMenu(menu, v, menuInfo); //コンテキストメニューの設定 menu.setHeaderTitle( "メニュータイトル" ); //Menu.add(int groupId, int itemId, int order, CharSequence title) menu.add( 0 , CONTEXT_MENU1_ID, 0 , "メニュー1" ); menu.add( 0 , CONTEXT_MENU2_ID, 0 , "メニュー2" ); } |
onCreateContextMenuメソッドの第1引数ContextMenuを利用して、メニューを作成します。
コンテキストメニューを出すViewはメソッドの第2引数で引き渡されます。ViewのIDからメニューを変更すれば、フレキシブルなメニュー構成が実現できます。
ContextMenuクラスの主要メソッド
ContextMenuはMenuクラスを継承して作成されています。ここでは代表的なメソッドを紹介します。
メソッド | 説明 |
---|---|
setHeaderTitle | メニューヘッダのタイトルを設定する |
setHeaderIcon | ヘッダーのIconを設定する。Drawable、Resourceから選べます。 |
setHeaderView | メニューヘッダ用のViewを指定できます |
add | メニューアイテムを追加します(Menuクラス) |
3.選択されたときのアクションコードを記述する
サンプルコードではonContextItemSelectedメソッドでメニュー押下時のイベントを記述しています
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public boolean onContextItemSelected(MenuItem item) { AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); switch (item.getItemId()) { case CONTEXT_MENU1_ID: //TODO:メニュー押下時の操作 return true ; case CONTEXT_MENU2_ID: //TODO:メニュー押下時の操作 return true ; default : return super .onContextItemSelected(item); } } |
3行目、MenuItemからコンテキストメニューの情報を取得します。AdapterContextMenuInfo はContextMenuの付加情報を扱うクラスです。
6行目以降、選択されたメニューIDに従い処理内容を記述します。AdapterContextMenuInfoのtargetViewを用いると、Viewごとに処理を変更する(たとえばメニューの構成を変えている場合など)ことができます。
AdapterContextMenuInfoクラス
AdapterContextMenuInfoクラスで提供されるメンバ情報です。いずれもpublicで、コンテキストメニューのための付加情報で構成されています。
publicメンバ | 説明 |
---|---|
id | コンテキストメニューで選択されたメニューID |
position | メニュー表示位置 |
targetView | コンテキストメニューのView情報 |
以上、おつかれさまでした。
About The Author
ひつじ(mhidaka)
Software Engineerだよ。DroidKaigi Organizer / Androidと組込とRe:VIEW。techbooster主宰。mhidaka's writings http://booklog.jp/users/mhidaka 技術書典! http://techbookfest.org