長押し操作で表示されるContextMenuを使う/Getting Started


Androidにはメニューボタンを押して表示されるオプションメニューの他に、コンテキストメニュー(ContextMenu)と呼ばれるメニューがあります。

コンテキストメニューは、画面を長押し(タップし続ける)することで表示されるメニューです。

使われる場面としては、リストビューに各アイテム(セル)などに設定してそれぞれの詳細情報を出すことなどがあげられます。例えば、ファイルマネージャアプリを思い浮かべてみましょう。ファイルの一覧をリストで表示し、長押しするとファイルの詳細情報や、コピーなどの操作を行うコンテキストメニューが表示されるのを見たことがあるかと思います。

このコンテキストメニューを使う場合に重要なメソッドは以下の通りです。
[table “212” not found /]

それでは続きで使い方を説明して行きます。

手順

コンテキストメニューを使う手順は以下の通りです。

  1. Activity#registerForContextMenuメソッドを使ってコンテキストメニューを表示するViewを登録する
  2. Activity#onCreateContextMenuメソッドを実装してコンテキストメニューを作成する
  3. Activity#onContextItemSelectedメソッドを実装してコンテキストメニューの項目が選択された時の処理を記述する

順に説明して行きます。

1.コンテキストメニューを表示するViewを登録する

ActivityクラスのregisterForContextMenuメソッドを使ってコンテキストメニューを表示するViewを登録します。ここで登録したViewを長押しすることで、コンテキストメニューが表示されるようになります。onCreateメソッド内で登録すると良いでしょう。

登録するViewは複数でも問題ありません。サンプルでは2つのView(ImageViewとTextView)を登録しています。

■src/ContextMenuActivity.java

// コンテキストメニューを表示させるViewを指定する
// 複数のView指定することも可能
ImageView imageView = (ImageView) findViewById(R.id.imageView);
TextView textView = (TextView) findViewById(R.id.textView);
registerForContextMenu(imageView);
registerForContextMenu(textView);

2.コンテキストメニューを作成する

コンテキストメニューを表示するように登録すると、そのViewを長押しした時にActivityクラスのonCreateContextMenuメソッドが呼ばれます。

■src/ContextMenuActivity.java

@Override
public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, view, menuInfo);

    int viewId = view.getId();

    // コンテキストメニューの設定
    if (viewId == R.id.imageView) {
        menu.setHeaderTitle("ImageViewのコンテキストメニュー");
        menu.setHeaderIcon(getResources().getDrawable(R.drawable.tb_mini));

        menu.add(0, CONTEXT_MENU_IMAGE_VIEW_ITEM_ID_1, 0, "ImageView メニュー 1");
        menu.add(0, CONTEXT_MENU_IMAGE_VIEW_ITEM_ID_2, 0, "ImageView メニュー 2");
    } else if (viewId == R.id.textView) {
        menu.setHeaderTitle("TextViewのコンテキストメニュー");
        menu.setHeaderIcon(getResources().getDrawable(R.drawable.ic_launcher));

        menu.add(0, CONTEXT_MENU_TEXT_VIEW_ITEM_ID_1, 0, "TextView メニュー 1");
        menu.add(0, CONTEXT_MENU_TEXT_VIEW_ITEM_ID_2, 0, "TextView メニュー 2");
    }
}

このonCreateContextMenuメソッドは、オプションメニューで言うとActivityクラスのonCreateOptionsMenuメソッドと同様の役割を持っています。

引き数で渡されるmenuに対し、9行目〜13行目でコンテキストメニューの設定を行っています。この設定を行ったメニューがViewを長押しした時に表示されることになります。

9行目:setHeaderTitleメソッドでタイトルを設定

10行目:setHeaderIconメソッドでアイコンを設定

12,13行目:addメソッドでメニューアイテム(項目)を追加

サンプルでは2つのViewをregisterForContextMenuメソッドで登録しているため、ViewのIDを調べて作成するコンテキストメニューを分けています。

3.コンテキストメニューの項目が選択された時の処理を記述する

最後の手順として、コンテキストメニューのアイテム(項目)が選択された時の処理を記述します。

アイテムを選択するとActivityクラスのonContextItemSelectedメソッドが呼ばれます。こちらはオプションメニューで言うとActivityクラスのonOptionsItemSelectedメソッドと同様の役割を持っています。

選択されたMenuItemクラスのインスタンスが引数で渡ってきます。getItemIdメソッドを使って判別し、それぞれに必要な処理を記述します。

■src/ContextMenuActivity.java

@Override
public boolean onContextItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case CONTEXT_MENU_IMAGE_VIEW_ITEM_ID_1:
            // TODO:メニュー押下時の操作
            return true;
        case CONTEXT_MENU_IMAGE_VIEW_ITEM_ID_2:
            // TODO:メニュー押下時の操作
            return true;
        case CONTEXT_MENU_TEXT_VIEW_ITEM_ID_1:
            // TODO:メニュー押下時の操作
            return true;
        case CONTEXT_MENU_TEXT_VIEW_ITEM_ID_2:
            // TODO:メニュー押下時の操作
            return true;
        default:
            return super.onContextItemSelected(item);
    }
}

まとめ

以上、コンテキストメニューを使う方法を説明でした。オプションメニューとほぼ同様の方法で使うことができることが分かって頂けたと思います。

注意する点としては、コンテキストメニューは画面の長押しと言う性質上、ユーザーがその存在自体に気がつかないことも考えられます。ヘルプ画面などで提示することも必要でしょう。

お疲れさまでした。