コンテキストメニューを作る


AndroidのコンテキストメニューはWindowsの右クリックメニューと同じような機能です。今回はコンテキストメニューの設定方法について紹介します。
長押し操作(しばらくタップしつづけること)でメニューを表示できます。
ViewごとにContextMenuを登録することが可能です。一番ポピュラーな使われ方としてはListViewにコンテキストメニューを追加することです。リストビューの要素の追加、変更、削除など編集操作用にコンテキストメニューを用意すれば、直感的でわかりやすいUIになります。

以下の手順でコンテキストメニューを作成します。

  1. コンテキストメニューを表示するViewを登録する
  2. メニューを作成する
  3. 選択されたときのアクションコードを記述する

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"?>
<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メソッドでコンテキストメニューで表示する中身を作成します。

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情報

以上、おつかれさまでした。

One Comment