◆ サブメニュー(チェックボックスとラジオボタン)
元のソースは前回のOptionsMenuTest2a.javaです。
"Agenda"のサブメニューにチェックボックスをつけて、有効なメニュー項目と無効なメニュー項目を指定するようにします。"Calendar"のサブメニューをグループ化して、どれかひとつを選択するようにします。これはラジオボタンが表示されます。
Androidプロジェクトの設定
プロジェクト名: OptionsMenuTest2b ビルドターゲット: Android 2.1-update1 アプリケーション名: OptionsMenuTest2b パッケージ名: jp.co.triware.samples.OptionsMenuTest2b アクティビティーの作成: OptionsMenuTest2bActivity 最小SDKバージョン: 7
OptionsMenuTest2bActivity.java
package jp.co.triware.samples.OptionsMenuTest2b; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.SubMenu; import android.widget.Toast; public class OptionsMenuTest2bActivity extends Activity { // "Agenda"メニューの項目ID private static final int OPTMENU_AGENDA = 10; private static final int OPTMENU_AGENDA_TODO = 11; private static final int OPTMENU_AGENDA_EVENT = 12; private static final int OPTMENU_AGENDA_ANNIVERSARY = 13; // "Calendar"メニューの項目ID private static final int OPTMENU_CALENDAR = 20; private static final int OPTMENU_CALENDAR_TODAY = 21; private static final int OPTMENU_CALENDAR_1DAY = 22; private static final int OPTMENU_CALENDAR_1WEEK = 23; private static final int OPTMENU_CALENDAR_2WEEK = 24; private static final int OPTMENU_CALENDAR_1MONTH = 25; private static final int OPTMENU_CALENDAR_2MONTH = 26; private static final int OPTMENU_CALENDAR_3MONTH = 27; private static final int OPTMENU_CALENDAR_6MONTH = 28; private static final int OPTMENU_CALENDAR_1YEAR = 29; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Override public boolean onCreateOptionsMenu(Menu menu) { // "Agenda"メニュー SubMenu subAgenda = menu .addSubMenu(Menu.NONE, OPTMENU_AGENDA, Menu.NONE, "Agenda") .setIcon(android.R.drawable.ic_menu_agenda); // "Agenda"メニューのサブメニュー subAgenda .add(Menu.NONE, OPTMENU_AGENDA_TODO, Menu.NONE, "To-Do") .setCheckable(true) .setChecked(true); subAgenda .add(Menu.NONE, OPTMENU_AGENDA_EVENT, Menu.NONE, "Event") .setCheckable(true); subAgenda .add(Menu.NONE, OPTMENU_AGENDA_ANNIVERSARY, Menu.NONE, "Anniversary") .setCheckable(true); // "Calendar"メニュー SubMenu subCalendar = menu .addSubMenu(Menu.NONE, OPTMENU_CALENDAR, Menu.NONE, "Calendar") .setIcon(android.R.drawable.ic_menu_my_calendar); // "Calendar"メニューのサブメニュー subCalendar .add(Menu.NONE, OPTMENU_CALENDAR_TODAY, Menu.NONE, "Day (Today)"); subCalendar .add(Menu.NONE, OPTMENU_CALENDAR_1DAY, Menu.NONE, "Day"); subCalendar .add(Menu.NONE, OPTMENU_CALENDAR_1WEEK, Menu.NONE, "Week"); subCalendar .add(Menu.NONE, OPTMENU_CALENDAR_2WEEK, Menu.NONE, "2-Week"); subCalendar .add(Menu.NONE, OPTMENU_CALENDAR_1MONTH, Menu.NONE, "Month"); subCalendar .add(Menu.NONE, OPTMENU_CALENDAR_2MONTH, Menu.NONE, "2-Month"); subCalendar .add(Menu.NONE, OPTMENU_CALENDAR_3MONTH, Menu.NONE, "3-Month"); subCalendar .add(Menu.NONE, OPTMENU_CALENDAR_6MONTH, Menu.NONE, "6-Month"); subCalendar .add(Menu.NONE, OPTMENU_CALENDAR_1YEAR, Menu.NONE, "Year"); subCalendar.setGroupCheckable(0, true, true); // add()した分についてグループを設定する subCalendar.findItem(OPTMENU_CALENDAR_TODAY).setChecked(true); // 初期値設定 return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { boolean bRet = true; String buf = ""; int id = item.getItemId(); switch (id) { case OPTMENU_AGENDA: buf = "Agenda"; break; case OPTMENU_AGENDA_TODO: buf = "To-Do List"; item.setChecked(item.isChecked() ? false : true); break; case OPTMENU_AGENDA_EVENT: buf = "Events List"; item.setChecked(item.isChecked() ? false : true); break; case OPTMENU_AGENDA_ANNIVERSARY: buf = "Anniversary List"; item.setChecked(item.isChecked() ? false : true); break; case OPTMENU_CALENDAR: buf = "Calendar"; break; case OPTMENU_CALENDAR_TODAY: buf = "Today's Calendar"; item.setChecked(true); break; case OPTMENU_CALENDAR_1DAY: buf = "1-Day Calendar"; item.setChecked(true); break; case OPTMENU_CALENDAR_1WEEK: buf = "1-Week Calendar"; item.setChecked(true); break; case OPTMENU_CALENDAR_2WEEK: buf = "2-Week Calendar"; item.setChecked(true); break; case OPTMENU_CALENDAR_1MONTH: buf = "1-Month Calendar"; item.setChecked(true); break; case OPTMENU_CALENDAR_2MONTH: buf = "2-Month Calendar"; item.setChecked(true); break; case OPTMENU_CALENDAR_3MONTH: buf = "3-Month Calendar"; item.setChecked(true); break; case OPTMENU_CALENDAR_6MONTH: buf = "6-Month Calendar"; item.setChecked(true); break; case OPTMENU_CALENDAR_1YEAR: buf = "1-Year Calendar"; item.setChecked(true); break; default: bRet = false; break; } if (buf.length() > 0) { Toast.makeText(getApplicationContext(), buf, Toast.LENGTH_SHORT).show(); } return bRet; } }
注意しなければならないのは、どちらもクリックしただけではサブメニュー上は変化がないという点です。チェック箇所を変更するのは自分でコードを書く必要があります。コードは、メニューがクリックされた時に実行されるonOptionsItemSelected()、あるいは、(次回の)メニュー表示時に実行されるonPrepareOptionsMenu()に記述します。クリックしただけでは、ラジオボタンやチェックボックスの表示は変わりませんので、今回のサンプルではonOptionsItemSelected()に記述しました。ここで実行することにより、メニューが消える一瞬前にチェックやラジオボタンが移ったことが視覚的にわかります。
75行目でsetGroupCheckable()を呼んでいますが、setGroupCheckable()はそれが呼ばれるまでに追加されたメニュー項目をグループ化します。ここでグループ化して、さらに第3引数で「排他」設定をしましたので、メニュー項目のどれかをクリックすると、選択されていたものは解除されて、クリックした箇所(正しくはsetChecked()したアイテム)だけが選択された状態になります。
93,97,101行目は、チェックボックスのON/OFFを反転させています。
なお、setGroupCheckable()の第3引数をfalseをセットすると、"Agenda"メニューと同じ様に、複数選択が可能になります。表示は、ラジオボタンではなくチェックボックスになります。チェックボックスのON/OFFは、"Agenda"メニューのコードと同じように記述する必要があります。
実行結果
チェックボックスです。複数選択もできます。
ラジオボタン(グループ化です)。排他指定していますからひとつしか選択できません。
0 件のコメント:
コメントを投稿