Androidアプリケーションにおけるメニューのひとつ、コンテキストメニューの作り方を紹介します。
コンテキストメニューは、Windowsでいうところの右クリックで表示されるメニューに近い意味を持つメニューです。
右クリックするときは必ずファイル等のオブジェクトを指定していますが、Androidでも同様になんらかのViewオブジェクトを対象に長押しすることでコンテキストメニューが表示されます。
コンテキストメニューの追加方法は、オプションメニューの場合とほとんど同じです。
Activity#onCreateContextMenu()の引数として渡されたContextMenuオブジェクトにadd()を使用してアイテムを追加していきます。
メニューをクリックしたときの処理は、Activity#onContextItemSelected()メソッドに記述します。
このメニューの作り方のポイントは、どのView ( ButtonやTextView等 ) を長押しした際にメニューを表示するかを決める必要があるということです。 Activity#registerForContextMenu()メソッドを使用し、引数にViewオブジェクトを渡します。
Activity#registerForContextMenu()メソッドのシグネチャ
public void registerForContextMenu (View view)
メニューを作成するonCreateContextMenu()メソッドのシグネチャは以下の通りです。
Activity#onCreateContextMenu()メソッドのシグネチャ
void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo)
データ型 | 引数名 | 概要 |
ContextMenu | menu |
オプションメニューと同様にMenu#add()でアイテムを追加する |
View | v | 長押しした対象のウィジェット |
ContextMenuInfo | menuInfo | 対象のウィジェットクラスに依存した追加情報 |
ポイントは、このメソッドの呼び出されるタイミングと、第3引数の取り扱いです。
このメソッドが呼び出されるのは、メニューが表示される直前です。
オプションメニューのときはメニューの作成されるタイミングがActivityと連動していましたが、オプションメニューではそれぞれのメニューが表示する直前となります。
第3引数のContextMenuInfoオブジェクトは長押ししたウィジェットがListViewなどのリストの場合に効果を発揮します。
このオブジェクトには長押された対象の行番号や行に対応するウィジェット ( 例えば、TextView ) の追加情報が含まれるのです。
つまり、ListViewなどのリストに対してコンテキストメニューを追加したい場合は、第2引数のViewにはListViewオブジェクトが、第3引数のContextMenuInfoにはどの行を対象に長押ししたかがわかるようなオブジェクトが渡されることになります。
簡単なコンテキストメニューのサンプルを紹介します。
TextViewを長押しするとコンテキストメニューが表示され、メニューをクリックするとToastが表示するシンプルなプログラムです。
オプションメニューのサンプルとほとんど一緒なのですが、大きく違う点は8行目のregisterForContextMenu()メソッドの呼び出しが必須となる点です。
public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView textView = new TextView(this); textView.setText("長押して下さい"); registerForContextMenu(textView); setContentView(textView); } @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { menu.add(0, 0, 0, "メニュー1"); menu.add(0, 10, 1, "メニュー2"); menu.add(0, 20, 2, "メニュー3"); } @Override public boolean onContextItemSelected(MenuItem item) { switch (item.getItemId()) { case 0 : Toast.makeText(this, "メニュー1がクリックされました", Toast.LENGTH_SHORT).show(); return true; case 10 : Toast.makeText(this, "メニュー2がクリックされました", Toast.LENGTH_SHORT).show(); return true; default : Toast.makeText(this, "コンテキストメニューがクリックされました", Toast.LENGTH_SHORT).show(); return super.onContextItemSelected(item); } } }