コンテキストメニューを作る
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