June 17, 2012

Action Barからサブメニューを表示する

Action Barのオプションメニューからサブメニューを表示する方法です。

Action Barにオプションメニューを表示するまでは「Action Barにオプションメニューを表示する」を参照してください。ここでは、そこからの差分を説明します。

サブメニューを表示するには、ActionProviderクラスを使用します。このクラスを継承してユーザー独自のクラスを作ることでオリジナルのサブメニューが表示できます。

まずはオプションメニューからサブメニューを呼び出します。呼び出すには"actionProviderClass"属性にクラス名を設定します。これでこのメニューアイテムが選択されると、このクラスを呼び出します。

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:id="@+id/item1" android:showAsAction="ifRoom|collapseActionView" android:icon="@android:drawable/ic_menu_search" android:actionViewClass="android.widget.SearchView"></item>
    <item android:id="@+id/item2" android:icon="@android:drawable/ic_menu_share" android:showAsAction="ifRoom" android:actionProviderClass="jp.myapp.sample.SampleActionProvider"></item>
    <item android:id="@+id/item3" android:title="@string/menu3" android:showAsAction="ifRoom"></item>
    <item android:id="@+id/item4" android:title="@string/menu4" android:showAsAction="ifRoom"></item>
</menu>

呼び出し先のActionProviderクラスを作成します。後でViewを作成するためにコンストラクタでcontextを保存しておくのが通例です。onCreateActionViewではViewを返す必要はなくnullで構いません。サブメニューがあることを伝えるためにhasSunMenu()ではtrueを返します。メニュー表示のたびにonPrepareSubMenu()が呼ばれるので、そこでサブメニューを作成します。この例ではxmlで作ったmenuリソースをセットし、それをクリックしたときのリスナーを自分自身になるようにしています(onMenuItemClick()が呼ばれます)。

public class SampleActionProvider extends ActionProvider implements OnMenuItemClickListener {
    private final static String TAB = "SampleActionProvider";
    private Context mContext;

    public SampleActionProvider(Context context) {
        super(context);
        mContext = context;
    }

    @Override
    public View onCreateActionView() {
        return null;
    }

    @Override
    public boolean hasSubMenu() {
        return true;
    }

    @Override
    public void onPrepareSubMenu(SubMenu subMenu) {
        subMenu.clear();
        MenuInflater inflator = new MenuInflater(mContext);
        inflator.inflate(R.menu.provider_menu, subMenu);
        for (int i = 0; i < subMenu.size(); ++i) {
            subMenu.getItem(i).setOnMenuItemClickListener(this);
        }
    }

    @Override
    public boolean onMenuItemClick(MenuItem item) {
        Log.i(TAB, "Title:" + item.getTitle());
        return true;
    }
}

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:id="@+id/item1" android:title="@string/menu1" android:icon="@android:drawable/ic_menu_compass"></item>
    <item android:id="@+id/item2" android:title="@string/menu2" android:icon="@android:drawable/ic_menu_camera"></item>
</menu>

実行すると下記のようになります。Action Barのオプションメニューの2番目のShareアイコンのボタンを押すとサブメニューが現れます。


No comments:

Post a Comment