2011年11月16日水曜日

OptionsMenu

今回はメニューボタンを押した時に表示されるオプションメニューです。

一度に表示できるメニューの数は6つまでです。それ以上メニューがある場合は左(左下)のメニューが「その他」に変わり、それをクリックすると残りのメニューの一覧が表示されます。メニューがたくさんある場合は、あまり使わないものを6番目以降にすると良いでしょう。

条件や状態によって表示するメニューを動的に変更することもできます。

起動時にonCreateOptionsMenu()が呼び出されます。そして、メニューボタンを押した場合はonPrepareOptionsMenu()が呼び出されます。以下のサンプルでは、このメソッドを使い分けることで、メニュー数が固定の場合と可変の場合に対応しました。これらのメソッドの戻り値は基本的にはtrueです。falseを返すとメニューを表示しません。


固定メニュー(onCreateOptionsMenu()で生成)

メニューの数や並び等を変更しない場合は、最初に生成しておきます。
メニュー作成のコードはonCreateOptionsMenu()に記述します。

Androidプロジェクトの設定
プロジェクト名:OptionsMenuTest1a
ビルドターゲット:Android 2.1-update1
アプリケーション名:OptionsMenuTest1a
パッケージ名:jp.co.triware.samples.OptionsMenuTest1a
アクティビティーの作成:OptionsMenuTest1aActivity
最小SDKバージョン:7

OptionsMenuTest1aActivity.java
package jp.co.triware.samples.OptionsMenuTest1a;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;

public class OptionsMenuTest1aActivity extends Activity {
    private static final int OPTMENU_ADD    = 1;
    private static final int OPTMENU_EDIT   = 2;
    private static final int OPTMENU_DELETE = 3;
    private static final int OPTMENU_SAVE   = 4;
    private static final int OPTMENU_INFO   = 5;
    private static final int OPTMENU_MANAGE = 6;
    private static final int OPTMENU_PREFS  = 7;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        menu.add(Menu.NONE, OPTMENU_ADD, Menu.NONE, "Add")
            .setIcon(android.R.drawable.ic_menu_add);
        menu.add(Menu.NONE, OPTMENU_EDIT, Menu.NONE, "Edit")
            .setIcon(android.R.drawable.ic_menu_edit);
        menu.add(Menu.NONE, OPTMENU_DELETE, Menu.NONE, "Delete")
            .setIcon(android.R.drawable.ic_menu_delete);
        menu.add(Menu.NONE, OPTMENU_SAVE, Menu.NONE, "Save")
            .setIcon(android.R.drawable.ic_menu_save);
        menu.add(Menu.NONE, OPTMENU_INFO, Menu.NONE, "About")
            .setIcon(android.R.drawable.ic_menu_info_details);
        menu.add(Menu.NONE, OPTMENU_MANAGE, Menu.NONE, "Manage")
            .setIcon(android.R.drawable.ic_menu_manage);
        menu.add(Menu.NONE, OPTMENU_PREFS, Menu.NONE, "Preferences")
            .setIcon(android.R.drawable.ic_menu_preferences);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        boolean bRet = true;
        String buf = "";
        int id = item.getItemId();
        switch (id) {
            case OPTMENU_ADD:
                buf = "Add";
                break;
            case OPTMENU_EDIT:
                buf = "Edit";
                break;
            case OPTMENU_DELETE:
                buf = "Delete";
                break;
            case OPTMENU_SAVE:
                buf = "Save";
                break;
            case OPTMENU_INFO:
                buf = "About";
                break;
            case OPTMENU_MANAGE:
                buf = "Manage";
                break;
            case OPTMENU_PREFS:
                buf = "Preferences";
                break;
            default:
                bRet = false;
                break;
        }
        if (buf.length() > 0) {
            Toast.makeText(getApplicationContext(), buf, Toast.LENGTH_SHORT).show();
        }
        return bRet;
    }
}

メニューが選択されるとonOptionsItemSelected()が呼び出されますので、そこに各メニューの処理を実装します。

実行結果
メニューボタンを押すとメニューが表示されます。「その他」を選択して・・・
「Preferences」を選択すると、Preferencesメニュー用の処理(Toast表示)が実行されました。


可変メニュー(onPrepareOptionsMenu()で生成)

メニューの数や並びを条件によって変更する場合は、オプションメニュー表示時に毎回生成します。
メニューボタンを押すとonPrepareOptionsMenu()が呼び出されますので、ここにメニュー生成のコードを記述します。ただしこのメソッドはメニューボタンが押される度に毎回呼び出されますので、メニューがどんどん追加されていってしまいます。これを回避するために、まずメニューを削除してから生成していきます。

以下のサンプルでは、どのメニューを有効にするか、チェックボックスで指定します。メニューの数によってどのように表示が変わるか確認してみてください。

Androidプロジェクトの設定
プロジェクト名:OptionsMenuTest1b
ビルドターゲット:Android 2.1-update1
アプリケーション名:OptionsMenuTest1b
パッケージ名:jp.co.triware.samples.OptionsMenuTest1b
アクティビティーの作成:OptionsMenuTest1bActivity
最小SDKバージョン:7

OptionsMenuTest1b.java
package jp.co.triware.samples.OptionsMenuTest1b;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.CheckBox;
import android.widget.Toast;

public class OptionsMenuTest1bActivity extends Activity {
    private static final int OPTMENU_ADD    = 1;
    private static final int OPTMENU_EDIT   = 2;
    private static final int OPTMENU_DELETE = 3;
    private static final int OPTMENU_SAVE   = 4;
    private static final int OPTMENU_INFO   = 5;
    private static final int OPTMENU_MANAGE = 6;
    private static final int OPTMENU_PREFS  = 7;

    private static  CheckBox cbAdd = null;
    private static  CheckBox cbEdit = null;
    private static  CheckBox cbDelete = null;
    private static  CheckBox cbSave = null;
    private static  CheckBox cbAbout = null;
    private static  CheckBox cbManage = null;
    private static  CheckBox cbPrefs = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        cbAdd = (CheckBox)findViewById(R.id.add_cb);
        cbEdit = (CheckBox)findViewById(R.id.edit_cb);
        cbDelete = (CheckBox)findViewById(R.id.delete_cb);
        cbSave = (CheckBox)findViewById(R.id.save_cb);
        cbAbout = (CheckBox)findViewById(R.id.about_cb);
        cbManage = (CheckBox)findViewById(R.id.manage_cb);
        cbPrefs = (CheckBox)findViewById(R.id.prefs_cb);
    }

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        menu.clear();
        if (cbAdd.isChecked() == true) {
            menu.add(Menu.NONE, OPTMENU_ADD, Menu.NONE, "Add")
                .setIcon(android.R.drawable.ic_menu_add);
        }
        if (cbEdit.isChecked() == true) {
            menu.add(Menu.NONE, OPTMENU_EDIT, Menu.NONE, "Edit")
                .setIcon(android.R.drawable.ic_menu_edit);
        }
        if (cbDelete.isChecked() == true) {
            menu.add(Menu.NONE, OPTMENU_DELETE, Menu.NONE, "Delete")
                .setIcon(android.R.drawable.ic_menu_delete);
        }
        if (cbSave.isChecked() == true) {
            menu.add(Menu.NONE, OPTMENU_SAVE, Menu.NONE, "Save")
                .setIcon(android.R.drawable.ic_menu_save);
        }
        if (cbAbout.isChecked() == true) {
            menu.add(Menu.NONE, OPTMENU_INFO, Menu.NONE, "About")
                .setIcon(android.R.drawable.ic_menu_info_details);
        }
        if (cbManage.isChecked() == true) {
            menu.add(Menu.NONE, OPTMENU_MANAGE, Menu.NONE, "Manage")
                .setIcon(android.R.drawable.ic_menu_manage);
        }
        if (cbPrefs.isChecked() == true) {
            menu.add(Menu.NONE, OPTMENU_PREFS, Menu.NONE, "Preferences")
                .setIcon(android.R.drawable.ic_menu_preferences);
        }
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        boolean bRet = true;
        String buf = "";
        int id = item.getItemId();
        switch (id) {
            case OPTMENU_ADD:
                buf = "Add";
                break;
            case OPTMENU_EDIT:
                buf = "Edit";
                break;
            case OPTMENU_DELETE:
                buf = "Delete";
                break;
            case OPTMENU_SAVE:
                buf = "Save";
                break;
            case OPTMENU_INFO:
                buf = "About";
                break;
            case OPTMENU_MANAGE:
                buf = "Manage";
                break;
            case OPTMENU_PREFS:
                buf = "Preferences";
                break;
            default:
                bRet = false;
                break;
        }
        if (buf.length() > 0) {
            Toast.makeText(getApplicationContext(), buf, Toast.LENGTH_SHORT).show();
        }
        return bRet;
    }
}

main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello"
        />

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:text="OptionsMenu:"
        />
    <ScrollView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        >
        <LinearLayout
            android:orientation="vertical"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            >
            <CheckBox
                android:id="@+id/add_cb"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:text="Add"
                />
            <CheckBox
                android:id="@+id/edit_cb"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:text="Edit"
                />
            <CheckBox
                android:id="@+id/delete_cb"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:text="Delete"
                />
            <CheckBox
                android:id="@+id/save_cb"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:text="Save"
                />
            <CheckBox
                android:id="@+id/about_cb"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:text="About"
                />
            <CheckBox
                android:id="@+id/manage_cb"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:text="Manage"
                />
            <CheckBox
                android:id="@+id/prefs_cb"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:text="Preferences"
                />
        </LinearLayout>
    </ScrollView>
</LinearLayout>

実行結果

表示するメニューの数によって表示レイアウトが変わります。最大3列2段=6件表示します。
メニューが7件以上ある場合は、6件目(右下)が「その他」に変わります。「その他」をクリックすると・・・
残りの6件目以降のメニューが一覧で表示されます。
横長の場合は6列1段で表示されます。

0 件のコメント:

コメントを投稿