メニューを表示するには、まずxmlファイルでメニューを定義します。
Eclipseのメニュー「ファイル」-「新規」-「その他」から「Android XML ファイル」を選択します。
次の画面では、リソースタイプを「Menu」にし、ファイル名を入力します。
完了すると、プロジェクトの「res」-「menu」フォルダにxmlファイルが生成されるので、ここにメニューを定義します。
以下がメニューxmlの例です。
<menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/menu1" android:titleCondensed="m1" android:title="menu1" android:icon="@drawable/menu_icon"> <menu> <item android:id="@+id/menu1_1" android:titleCondensed="m1_1" android:title="Menu1_1"/> <item android:id="@+id/menu1_2" android:titleCondensed="m1_2" android:title="Menu1_2"/> </menu> </item> <item android:id="@+id/menu2" android:title="menu2" android:titleCondensed="m2" android:icon="@drawable/menu_icon"> <menu> <group android:id="@+id/menu2_g1" android:checkableBehavior="all"> <item android:id="@+id/menu2_g1_1" android:title="Menu2_g1_1"/> <item android:id="@+id/menu2_g1_2" android:title="Menu2_g1_2"/> </group> <group android:id="@+id/menu2_g2"> <item android:id="@+id/menu2_g2_1" android:title="Menu2_g2_1"/> </group> </menu> </item> </menu>menuタグの中にitemタグでメニューの項目を定義します。menuタグは入れ子にすることができ、入れ子にされたmenuはサブメニューになります。また複数の項目をgroupタグで囲うことでグループ化できます。グループ化すると、複数の項目を同時に非表示にする等の操作が簡単になります。
itemタグの主な属性は以下の通りです。
title | 項目の表示文字列 |
titleCondensed | 項目の省略表示文字列。表示する際にtitleに設定した文字列だと長すぎる場合、こちらが表示される。 |
icon | 項目のアイコン |
showAsAction | アクションバーでの表示方法 |
checkable | trueなら項目にチェックボックスを表示する |
orderInCategory | group内での項目並び順 |
今回は上記xml例で定義したメニューをAndroid2.3で表示してみます。
まず、オプションメニューを表示するActivityのonCreateOptionsMenu()をオーバーライドします。
@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.option_menu_sample, menu); return true; }MenuInflater.inflate()の第1引数に表示するメニューを定義したメニューリソースを指定します(上記コードの場合、option_menu_sample.xmlに定義したメニューを表示します)。
次に、メニュー項目を選択されたときの動作を定義します。
@Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menu1_1: Toast.makeText(this, "Menu1_1 selected.", Toast.LENGTH_SHORT).show(); return true; case R.id.menu2_g1_1: case R.id.menu2_g1_2: // チェックボックスは自前でチェック状態を反転させる必要あり if (item.isChecked()) { item.setChecked(false); } else { item.setChecked(true); } return true; default: // メニュー選択イベントをハンドリングしないときは、 // superクラスのonOptionsItemSelected()を呼び出す。 return super.onOptionsItemSelected(item); } }上記のようにActivityのonOptionsItemSelected()をオーバーライドし、選択項目に応じた処理を記述します。
MenuItem.getItemId()で選択項目のIDが取得できるので、それをswitchのキーにします。
上記の例では、menu1_1を選択されたときにToastを表示し、menu2_g1_1、menu2_g1_2を選択されたときはチェックボックスの状態をトグルしています。また、コメントにも書いていますが、選択イベントをハンドリングしないときはsuper.onOptionsItemSelected()を呼び出すようにします。
上記のオプションメニューを表示させると以下のようになります。
一番左がメニューボタンを押下したときの表示、真ん中がmenu1を選択したときの表示、右がmenu2を選択したときの表示です。このようにサブメニューは親の項目を選択したときにポップアップで表示されます。
ちなみにアイコンは自作の適当アイコンです(´ー`A;)実際のアプリでは項目を表した適切な画像を使いましょう。
0 件のコメント:
コメントを投稿