ListView長押しでコンテキストメニューを表示させる

メイン画面でListViewを長押しするとコンテキストメニューが表示され、レコードの削除などが出来るようにしたい。

スポンサーリンク

メニューリソースの作成

メニューリソースを作成する。詳細画面の表示とレコードの削除が出来るようにしたいので、その2つを定義。

menu/reclist_context_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
  <item
      android:id="@+id/reclist_showDetail"
      android:title="詳細" />
  <item
      android:id="@+id/reclist_delete"
      android:title="削除" />
</menu>

コンテキストメニューを追加するためのコード

リストを長押しすると表示されるメニューはフローティング コンテキスト メニューと言うらしい。これを表示するためには、本家のガイドによると以下の手順を踏めば良い。

  1. registerForContextMenu() を呼び出し、View を渡して、コンテキスト メニューに関連付ける必要のある View を登録する
  2. Activityに onCreateContextMenu() メソッドを実装する
  3. メニューを選択すると呼ばれるonContextItemSelected() に所望のアクションを実装する

ListViewはMainActivity画面の中にあるので、上記メソッドをMainActivity.javaに実装することになる。まずは1.のregisterForContextMenu()をOnCreateメソッドに実装する。ListView関連部分のみを以下に抜粋。

MainActivity.java

    @Override
    protected void onCreate(Bundle savedInstanceState) {
     :
    curAdapter = new ListCursorAdapter(this, null, FLAG_REGISTER_CONTENT_OBSERVER);

    ListView listView = (ListView)findViewById(R.id.listView);
    listView.setAdapter(curAdapter);

        registerForContextMenu(listView);
      :
    }

2.のonCreateContextMenu() メソッドは以下。上記reclist_context_menu.xmlで定義したメニューが開かれる。

MainActivity.java

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.reclist_context_menu, menu);
    }

3.のonContextItemSelected()へ所望のアクションを記述。とりあえず今回は、Toastに何が選択されたか表示するのにとどめる。

MainActivity.java

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
        switch (item.getItemId()) {
        case R.id.reclist_showDetail:
            Toast.makeText(getApplicationContext(), "Selected Detail" + info.id, Toast.LENGTH_LONG).show();
            return true;
        case R.id.reclist_delete:
            Toast.makeText(getApplicationContext(), "Selected Delete" + info.id, Toast.LENGTH_LONG).show();
            return true;
        default:
            return super.onContextItemSelected(item);
        }
    }

実行結果

リスト長押しでメニューが開いた状態のスクショ。

メニューを選択した後。リストのどこを選択したかがidで取得出来ている。

コメント