一度に表示できるメニューの数は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 件のコメント:
コメントを投稿