コンテキストメニューを作る
AndroidのコンテキストメニューはWindowsの右クリックメニューと同じような機能です。今回はコンテキストメニューの設定方法について紹介します。
長押し操作(しばらくタップしつづけること)でメニューを表示できます。
ViewごとにContextMenuを登録することが可能です。一番ポピュラーな使われ方としてはListViewにコンテキストメニューを追加することです。リストビューの要素の追加、変更、削除など編集操作用にコンテキストメニューを用意すれば、直感的でわかりやすいUIになります。
以下の手順でコンテキストメニューを作成します。
- コンテキストメニューを表示するViewを登録する
- メニューを作成する
- 選択されたときのアクションコードを記述する
ContextMenuの関連メソッド
大事なメソッド・クラス | 説明 |
---|---|
Activity#registerForContextMenu | コンテキストメニューの登録 |
Activity#onCreateContextMenu | コンテキストメニューの作成 |
ContextMenu#setHeaderTitle | メニュータイトル |
ContextMenu#add | メニュー追加 |
AdapterContextMenuInfoクラス | コンテキストメニューの付加情報 |
コンテキストメニューはアイコン表示やショートカットキーによる操作をサポートしていない、など機能に制限があります。写真を見てもわかるように、シンプルな補助メニューという位置づけです。
サンプルコードは続きから
1.コンテキストメニューを表示するViewを登録する
@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
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 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メソッドでコンテキストメニューで表示する中身を作成します。
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メソッドでメニュー押下時のイベントを記述しています
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