2013年9月24日火曜日

Android Support Library v7でActionBarにメニューボタンが表示されない件

そろそろアプリをActionBarに対応しようかと思い立って、2か月前にリリースされた
ActionBarを含むSupport Library v7(appcompat)を使用する事にした。
SDKに含まれるappcompatの既存プロジェクトをEclipseでインポートして、ターゲットの
プロジェクトに依存関係を設定すれば簡単に組み込む事が出来る。(詳細は割愛)

ActivityをActionBarActivityに切り替えて、下記のメニューアイテムを
列挙したメニューのxmlにshowAsActionを追加すればActionBarにメニュー
ボタンが表示されるだろう、と思っていたら見事にハマってしまった。
Support Library v7のActionBarでは下記の方法では各メニューボタンは
表示されずに全てMore(3点アイコン)に含まれてしまう。


    
    
    
    
    


実際にActionBarに各メニューボタンを表示させるにはonCreateOptionMenu()で
inflateしていた箇所をコメントアウトして、各メニューアイテムおよびそのリスナーを
記述した後にMenuItemCompat.setShowAsAction()を記述する必要がある。
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    // menu.xmlを無視するためコメントアウト
    //inflater.inflate(R.menu.menu, menu);

    MenuItem item = menu.add(R.string.menu_add)
            .setIcon(android.R.drawable.ic_menu_add)
            .setOnMenuItemClickListener(new OnMenuItemClickListener() {
                
                @Override
                public boolean onMenuItemClick(MenuItem item) {
                    // 任意の処理

                    return true;
                }

            });

    MenuItemCompat.setShowAsAction(item, MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);

    item = menu.add(R.string.menu_settings)
            .setIcon(android.R.drawable.ic_menu_preferences)
            .setOnMenuItemClickListener(new OnMenuItemClickListener() {
                
                @Override
                public boolean onMenuItemClick(MenuItem item) {
                    // 任意の処理

                    return true;
                }
                
            });

    MenuItemCompat.setShowAsAction(item, MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);
}
上記のようにinflateをコメントアウトするとonOptionsItemSelected()に記述していた
処理は実行されなくなる。メニューのxmlに定義せず、わざわざソースに全て記述しないと
いけないのはとても面倒なのだが、他に良い方法はあるのだろうか?


【2013/10/17 追記】
コメントで教えて頂いた内容を追記しておくと、メニューのxmlにnamespaceで
xmlns:appを宣言して、メニューアイテムにapp:showAsActionを記述する事で、
ソースに記述する事なくActionBarにメニューアイテムを表示する事が可能となる。
"app"の部分は任意の名称で構わない。


    
    
    
    
    


後は従来通りonOptionsItemSelected()に処理を記述すれば問題なく動作する。
また下記サイトにも詳しく載っているので要参照。

■ android.support.v7.app.ActionBar - チラシの裏
http://www.globefish.jp/mt/2013/07/androidsupportv7appactionbar.html

2 件のコメント:

  1. FYI.

    http://wptrafficanalyzer.in/blog/action-bar-menus-and-splitactionbar-using-actionbarcompat-library-in-android/

    返信削除
    返信
    1. 情報提供ありがとうございました。本エントリーに追記させて頂きました。ライブラリの使い方は事前にきちんと調べて使わないと駄目ですね…。

      削除