このページの本文へ

前へ 1 2 3 次へ

これで作れる! Androidのアプリケーション 第6回

Androidアプリ内で表示されるメニューを作成する

2010年08月05日 12時00分更新

文● 塩田紳二

  • この記事をはてなブックマークに追加
  • 本文印刷

メニューを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ファイルを新規に作成し、ダブルクリックでメニュー(項目エディタ)を起動させます。

Eclipseのメニュー編集画面。1つのメニューに1つのXMLファイルが対応し、作ることができるのはメニュー項目、サブメニュー、メニューグループの3種類。メニューキーを表示したときに表示されるのがメニュー項目となり、それぞれにサブメニューを作ることができる

 最低限「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;

 メニューは、アプリケーションでユーザーが機能を選択して実行させるもので、直接のオブジェクトのタッチなどでは表現できないようなもの、あるいは設定画面への移動などのように補助的なものを実行させる場合に使うといいでしょう。

 さて、次回は設定の保存や設定画面の作成について解説する予定です。

前へ 1 2 3 次へ

カテゴリートップへ

この連載の記事

注目ニュース

ASCII倶楽部

プレミアムPC試用レポート

ピックアップ

ASCII.jp RSS2.0 配信中

ASCII.jpメール デジタルMac/iPodマガジン