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