Androidではメニューボタンを押すとメニュー、方向パッドを長押しするとコンテキストメニューを表示することができる。メニュー、コンテキストメニューもアクティビティのレイアウトと同様にxmlファイルとjavaソースどちらからも扱う事ができる。xmlファイルで作る方が手間がかからないため、ここではxmlファイルを使った方式で説明する。
実例を見てみよう。まず、res/menu/menu.xmlファイルを追加する
menu.xmlファイルの中身は以下の通りで、menu要素でmenuの全体の設定をitem要素でメニューに含まれる一つ一つの項目設定を行う。
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/menu_dialog1" android:title="メニューダイアログ1" android:numericShortcut="1" /> <item android:id="@+id/menu_dialog2" android:title="メニューダイアログ2" android:numericShortcut="2" /> </menu>
javaのソース側は以下の通り。メニューが作成される際に起動されるActivityクラスのonCreateOptionsMenuをオーバーライドし、メニューが作成される際にxmlに定義した項目を追加する。メニューの追加にはMenuInflaterクラスを使用するぐらいで特に手間がかかることはない。次にActivityクラスのonOptionsItemSelectedもオーバーライドする。これはメニューの項目が選択された際に起動される関数で、選択されたメニューが引数として渡される。以下の例では選択されたメニュー毎に異なるダイアログを表示する様にしている。
package com.suddenAngerSystem;
import android.app.Activity;
import android.app.AlertDialog;
import android.os.Bundle;
import android.view.MenuInflater;
import android.view.MenuItem;
public class Menu extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
//メニューが生成される際に起動される。
//この中でメニューのアイテムを追加したりする。
@Override
public boolean onCreateOptionsMenu(android.view.Menu menu) {
super.onCreateOptionsMenu(menu);
//メニューインフレーターを取得
MenuInflater inflater = getMenuInflater();
//xmlのリソースファイルを使用してメニューにアイテムを追加
inflater.inflate(R.menu.menu, menu);
//できたらtrueを返す
return true;
}
//メニューのアイテムが選択された際に起動される。
@Override
public boolean onOptionsItemSelected(MenuItem item) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("タイトル");
final String message;
switch (item.getItemId()) {
case R.id.menu_dialog1:
message = "メニュー1が指定された!";
break;
case R.id.menu_dialog2:
message = "メニュー2が指定された!";
break;
default:
message = "良く分からないメニューが指定された!";
break;
}
builder.setMessage(message);
builder.setPositiveButton("OK",new android.content.DialogInterface.OnClickListener() {
public void onClick(android.content.DialogInterface dialog,int whichButton) {
setResult(RESULT_OK);
}
});
builder.create();
builder.show();
return true;
}
}
起動すると以下の様なメニューが表示され、メニューを選択するとダイアログが表示される。
コンテキストメニューについてもほぼ同様に作成できる。onCreateContextMenuはonCreateOptionsMenuにonContextItemSelectedはonCreateContextMenuに対応している。ここでは参考のため、xmlファイルでなく、javaのソースでメニューアイテムを生成している
final static int CONTEXT_ITEM_ID1 = 1000;
final static int CONTEXT_ITEM_ID2 = 1001;
//コンテキストメニューが生成される時に起動される
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.add(0, CONTEXT_ITEM_ID1, 0, "アイテム1");
menu.add(0, CONTEXT_ITEM_ID2, 0, "アイテム2");
}
//メニューのアイテムが選択された際に起動される
@Override
public boolean onContextItemSelected(MenuItem item) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("タイトル");
final String message;
switch (item.getItemId()) {
case CONTEXT_ITEM_ID1:
message = "メニュー1が指定された!";
break;
case CONTEXT_ITEM_ID2:
message = "メニュー2が指定された!";
break;
default:
message = "良く分からないメニューが指定された!";
break;
}
builder.setMessage(message);
builder.setPositiveButton("OK",new android.content.DialogInterface.OnClickListener() {
public void onClick(android.content.DialogInterface dialog,int whichButton) {
setResult(RESULT_OK);
}
});
builder.create();
builder.show();
return true;
}
ただし、メニューと異なり、コンテキストメニューはデフォルトが作成しないことになっているため、以下の様にregisterForContextMenuでコンテキストメニューを表示させるVIEWを指定する必要がある。
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Button button = new Button(this);
button.setText("ボタンのテキスト");
registerForContextMenu(button);
setContentView(button);
}
コンテキストメニューはGUIアイテムを選択し、十字キーの真ん中を長く押すか、長くクリックするかで表示できる。
以下の様な機能を持つアプリケーションを作成せよ。
以下の様なイメージ。
コメントアウトしてあるので、ソースを確認すること。