X

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

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

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

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

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

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

mhidaka: Software Engineerだよ。DroidKaigi Organizer / Androidと組込とRe:VIEW。techbooster主宰。mhidaka's writings http://booklog.jp/users/mhidaka 技術書典! http://techbookfest.org