メニューチュートリアル

メニュー

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アイテムを選択し、十字キーの真ん中を長く押すか、長くクリックするかで表示できる。

参考サイト

宿題

以下の様な機能を持つアプリケーションを作成せよ。

  1. メニュー1,2がグループ化され、メニュー3,4,5がグループ化されている
  2. メニュー5にはサブメニュー1,2がある
  3. メニューが選択されたらダイアログでメニュー番号を表示する。(サブメニュー1,2は6,7の扱い)

以下の様なイメージ。

解答例

コメントアウトしてあるので、ソースを確認すること。