リストビュー内のコンテキストメニュー

ここではリストビュー内の項目に対するコンテキストメニューを説明します。

オプションメニューはユーザーに対して、その画面(アクティビティ)全体に対して他にできることを提示するのに対し、 コンテキストメニューというのはもっと小さいな単位でのメニューということになります。

例えばファイルマネージャプログラム内のファイル単位とか、ギャラリーの写真一つ一つといった単位です。

ここではそういう小さいアイテムを表示する代表格とも言える、リストビューでのコンテキストメニューの表示方法を示します。

リストビューでのコンテキストメニューの表示

ここで作るプログラムは次の通りです。リストビューが表示されています。

オプションメニュー

メニュー項目を長押しすることで、コンテキストメニューが表示されます。

オプションメニュー

コンテキストメニュー内の項目を選択すると、実際にそれが選択されたことがわかるようにトースト通知が表示されます。

オプションメニュー

コンテキストメニューのレイアウトファイル res/menu/listview1_context.xml は次の通りです。

<menu
  xmlns:android="http://schemas.android.com/apk/res/android" >
<item
  android:id="@+id/listview1_edit"
  android:showAsAction="never"
  android:title="Edit"/>
<item
  android:id="@+id/listview1_delete"
  android:showAsAction="never"
  android:title="Delete"/>
</menu>

リストビューに表示する内容は前回のスピナーの内容と同じで、 res/values/strings.xml に定義しています。

プログラム全体のレイアウト (res/layout/activity_main.xml) は次の通りです。

<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical">
  <ListView
    android:id="@+id/listView1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>
</LinearLayout>

コードは次の通り。

package com.example.menutest3;

import android.os.Bundle;
import android.app.Activity;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

public class MainActivity extends Activity {

  ListView listView1;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ArrayAdapter<CharSequence> adapter =
      ArrayAdapter.createFromResource(
      this,
      R.array.planets_array,
      android.R.layout.simple_list_item_1);
    listView1 = (ListView)findViewById(R.id.listView1);
    listView1.setAdapter(adapter);

    registerForContextMenu(listView1);
  }

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

    switch(v.getId()){
    case R.id.listView1:

      AdapterView.AdapterContextMenuInfo info =
        (AdapterView.AdapterContextMenuInfo) menuInfo;
      String[] a = getBaseContext().getResources().
        getStringArray(R.array.planets_array);
      String s = a[info.position];
      menu.setHeaderTitle(s);

      getMenuInflater().inflate(
        R.menu.listview1_context, menu
      );

      break;
    }
  }

  @Override
  public boolean onContextItemSelected(MenuItem item) {

    switch(item.getItemId()){
    case R.id.listview1_delete:

      AdapterView.AdapterContextMenuInfo info =
      (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();

      String[] a = getBaseContext().getResources().
        getStringArray(R.array.planets_array);
      String s = a[info.position];

      Toast.makeText(getBaseContext(), s
        + " - Delete", Toast.LENGTH_SHORT).show();

      return true;

    case R.id.listview1_edit:
      return true;
    }
    return false;
  }
}

ポイントはリストビューのコンテキストメニューを処理するために、registerForContextMenu メソッドでリストビューを登録するところです。

これによって、このアクティビティのコンテキストメニュー作成処理 (onCreateContextMenu メソッド) やコンテキストメニュー選択処理 (onContextItemSelected メソッド) に、 リストビューのコンテキストで発生したものが同時に組み込まれます。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Android 開発入門