前人未踏の領域へ Androidアプリ開発編

Androidアプリ開発に関する調査メモ置き場。古い記事にはアプリ以外も含まれます。

Menuを使い回す

画面によって表示するメニューが異なるものの、大体同じだったり
常に登場するメニューがあるとする。その場合は項目のグループごとにファイルを分割する。

res/menu/detail.xml (詳細画面でのみ表示)

<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <!-- 検索 -->
    <item
        android:id="@id/action_search_item"
        android:actionViewClass="android.support.v7.widget.SearchView"
        android:icon="@drawable/abc_ic_search"
        android:orderInCategory="1"
        android:showAsAction="ifRoom|collapseActionView"
        android:title="@string/search"/>
    <item android:id="@id/action_share_item"
        android:orderInCategory="3"
        android:showAsAction="ifRoom"
        android:title="@string/share"
        />
</menu>

res/menu/global.xml (常に表示)

<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <!-- map -->
    <item
        android:id="@id/menu_map"
        android:orderInCategory="2"
        android:showAsAction="ifRoom"
        android:title="@string/map"/>
    <!-- 設定 -->
    <item
        android:id="@id/menu_settings"
        android:orderInCategory="10"
        android:showAsAction="never"
        android:title="@string/settings"/>
    <!-- ヘルプ -->
    <item
        android:id="@id/menu_help"
        android:orderInCategory="20"
        android:showAsAction="never"
        android:title="@string/help"/>
    <!-- このアプリについて -->
    <item
        android:id="@id/menu_about"
        android:orderInCategory="30"
        android:showAsAction="never"
        android:title="@string/about"/>
</menu>

で、まとめてinfrateする。このとき、共通項目なんだけど、順番的には個別項目の間にくるようなケースがある。
そんな場合は android:orderInCategoryでソート順を指定するといい感じにソートして表示してくれる。

@Override
public boolean onCreateOptionsMenu(Menu menu) {
	MenuInflater inflater = new MenuInflater(this);
	inflater.inflate(R.menu.item_detail, menu);
	inflater.inflate(R.menu.global, menu);
}