階層構造を持つメニューの作成

1つのメニューがクリックされたら他のメニューグループを表示するような階層構造を持つメニューが作りたかったので、その作成方法を紹介します。

手順は次のようなものです。

  1. メニューを定義したxmlファイルを作る
  2. オプションメニューを設置する
  3. 押されたメニューに応じて処理をする

メニューをxmlで定義する

まず、次の画像のような階層構造を持ったxmlファイルをmenu/main.xmlファイルに作ります。

階層構造を持つメニューの例

このメニューは次のようなxmlファイルでできています。

<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    
    <item 
        android:id="@+id/setting_menu" 
        android:title="@string/setting" 
        android:icon="@drawable/setting" 
        android:showAsAction="always" >
        <menu>
            <item android:id="@+id/font_menu" 
                android:title="@string/font_menu_title" 
                     android:icon="@drawable/font" />
            <item android:id="@+id/icon_menu" 
                android:title="@string/icon_menu_title" 
                android:icon="@drawable/icon" />
        </menu>
</menu>

itemタグ内にもmenuタグを置くことができるので、これでメニューに階層構造を持たせることができます。

各アイテムにはタイトルとアイコン画像を指定しています。

また、アクションバーに表示するメニュについてはshowAsAction属性を"always"にして常に表示させるようにしています。

メニューを設置する

次に以下のコードをActivityクラス内に書き、メニューをアクションバーに設置します。

    @Override
    public boolean onCreateOptionsMenu(Menu menu) 
    {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.main, menu);
            //メニューのxmlファイルを設定
        return true;
    }

MenuInflaterクラスのinflateメソッドにメニューのレイアウトID(R.id.main)を渡すだけで画面にメニューが表示されます。

メニューが押されたときの処理

最後にどのメニューが押されたかを判断する処理をActivityのonOptionsItemSelectedメソッド内で行います。

コードは次のようになります。

    public boolean onOptionsItemSelected(MenuItem item)
    {
        switch(item.getItemId()){
        case R.id.font_menu:
            Log.i("MainActivity : ", "メニュー1");
            return true;
        case R.id.icon_menu:
            Log.i("MainActivity : ", "メニュー2");
            return true;
        default:
            return super.onOptionsItemSelected(item);
        }
    }

渡されたMenuItemからgetItemIdでIDを取得して、そのIDに応じた処理をしています。

関連項目
プライバシーポリシー