メニューをXMLから作る
今度は、XMLファイルからメニューを作る方法を見ていくことにしましょう。対応するコードは、EditItem.javaの182行目からで以下になります。
public boolean onCreateOptionsMenu( Menu menu ) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.delete, menu);
return true;
}
また、xmlのほうはdelete.xmlです。
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/menu_delete"
android:title="@string/menu_delete_edit_str"
android:icon="@android:drawable/ic_menu_delete"
android:enabled="true" android:visible="true"
android:alphabeticShortcut="d"
android:numericShortcut="0" >
</item>
<item android:id="@+id/menu_cancel_edit"
android:title="@string/menu_cancel_edit_str"
android:icon="@android:drawable/ic_menu_revert"
android:visible="true" android:enabled="true"
>
</item>
</menu>
メニューをxmlから作るには「インフレーター(Inflater)」を使います。インフレーターとはxmlを解釈してオブジェクトを生成します。メニュー以外にビューなどもインフレーターで生成することができます。
xmlのほうではメニューに必要な項目をitemタグのアトリビュートで指定します。メニュー用のxmlを生成するには、res/menuフォルダにxmlファイルを新規に作成し、ダブルクリックでメニュー(項目エディタ)を起動させます。
最低限「Id」「Title」「Visible」「Enabled」を指定します。Visibleは可視かどうか、Enabledは、選択可能かどうか(falseだとグレーアウトされる)です。
なお、メニュー項目の選択には、キーボードやテンキーを持つ機種用にショートカット文字を指定することが可能です。
メニュー項目の選択
プログラムの状況によっては、特定のメニュー項目の選択を禁止したいときがあります。今回のプログラムでは、画面上に空きがないときには、アイテム追加のメニューを禁止状態にしています。そのコードは以下のリストで、WorldClock.javaの246行にあります。対象となるメニューは、引数であるmenuに入れられてonPrepareOptionsMenuが呼び出されます。
public boolean onPrepareOptionsMenu(Menu menu) {
if (items.size()>1){
TzItem tzx = items.get(items.size()-1);
if (root.getBottom() - tzx.myView.getBottom() > tzx.myView.getHeight()/2 ) {
menu.findItem(MENU_ITEM_ADD).setEnabled(true);
} else {
menu.findItem(MENU_ITEM_ADD).setEnabled(false);
}
}
return true;
}
選択禁止にするには、「setEnabled(false)」メソッドを実行します。対象となるメニュー項目は、項目を追加するときに使った「MENU_ITEM_ADD」を使い、「menu.findItem(MENU_ITEM_ADD)」で探します。
コード自体はちょっと面倒ですが、アイテムが1つ以上あるとき(つまりゼロではないとき)に、空き領域のサイズを計算して、入る余地がないようならば、メニューを選択禁止にしています。デフォルトは選択可能なので、アイテムが0のときにはサイズに関わらず選択可能です。
このイベントリスナーも、処理が成功したことを通知するためにtrueを返すようにします。
メニューが選択されたときの処理
ユーザーがメニューを選択したら、onOptionsItemSelectedが呼ばれます。このとき引数は、選択されたメニュー項目オブジェクトです。WorldClock.javaでは259行目からのコードです。
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case MENU_ITEM_ADD:
additem();
break;
case MENU_ITEM_SET:
setting();
break;
case MENU_ITEM_DTSET:
setsystemdate();
break;
case MENU_ITEM_END:
endApp();
break;
}
return true;
}
メニューには、インテントを割り当てて実行させたり、個別にイベントリスナーを定義する方法もあります。ですが、xml側で記述ができず、コードを簡略することにはならないため使いませんでした。具体的には引数として受け取ったitem(MenuItemオブジェクト)を使って、getItemIdメソッドを使ってメニューIDを取り出しています。これをswitchで個々の値ごとに分岐させて処理しています。
もし、xmlでメニューを記述していたら、以下のリストのようにcase文で「R.id.」を使ったid記述を行ないます。これは、メニュー定義のxmlで@+id/xxxとして定義したIDに対応します。
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_delete:
if (tag > 0 ) {
WorldClock.delete(tag);
}
setResult(RESULT_CANCELED,retIntent);
finish();
break;
case R.id.menu_cancel_edit:
setResult(RESULT_CANCELED,retIntent);
finish();
}
return true;
メニューは、アプリケーションでユーザーが機能を選択して実行させるもので、直接のオブジェクトのタッチなどでは表現できないようなもの、あるいは設定画面への移動などのように補助的なものを実行させる場合に使うといいでしょう。
さて、次回は設定の保存や設定画面の作成について解説する予定です。
この連載の記事
-
第11回
スマホ
アプリケーションをAndroidマーケットに登録する -
第10回
スマホ
ブロードキャストへの応答とタイマ割り込み -
第9回
スマホ
Androidアプリで複数の項目を表示するリストビューを使う -
第8回
スマホ
Androidアプリに必要なダイアログを作る -
第7回
スマホ
Androidアプリの設定画面を作成する -
第5回
スマホ
インテントによるアプリケーションとアクティビティの呼出し -
第4回
スマホ
Androidアプリを構成する「アクティビティ」を実際に作る -
第3回
スマホ
アプリケーションの基本となる「アクティビティ」 -
第2回
スマホ
開発したアプリをエミュレーターやデバッガ上でテストする -
第1回
スマホ
Androidアプリの開発環境であるEclipseの使い方を知る - この連載の一覧へ