リストビュー内のコンテキストメニュー
ここではリストビュー内の項目に対するコンテキストメニューを説明します。
オプションメニューはユーザーに対して、その画面(アクティビティ)全体に対して他にできることを提示するのに対し、 コンテキストメニューというのはもっと小さいな単位でのメニューということになります。
例えばファイルマネージャプログラム内のファイル単位とか、ギャラリーの写真一つ一つといった単位です。
ここではそういう小さいアイテムを表示する代表格とも言える、リストビューでのコンテキストメニューの表示方法を示します。
リストビューでのコンテキストメニューの表示
ここで作るプログラムは次の通りです。リストビューが表示されています。
メニュー項目を長押しすることで、コンテキストメニューが表示されます。
コンテキストメニュー内の項目を選択すると、実際にそれが選択されたことがわかるようにトースト通知が表示されます。
コンテキストメニューのレイアウトファイル 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 メソッド) に、 リストビューのコンテキストで発生したものが同時に組み込まれます。