Help us understand the problem. What is going on with this article?

Android:ActionBarにOverFlowメニューを表示させる

More than 5 years have passed since last update.

ActionBarのメニューはOverFlowメニューだけ!!

この記事はAndroid4.0以上の開発向けです。

Chromeとか、FaceBookとかで右上にある「≡」マークのボタンを押すと、
複数のメニューがでてきますよね?

あれはOverFlowメニューと呼ぶらしです。

res/menu
にXMLで記載して、ActivityのonCreateOptionsMenuメソッドでメニューを設定すれば
簡単にメニューが表示できるのですが・・・

メニューのXML例

<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@+id/menu_camera"
        android:orderInCategory="1"
        android:title="@string/menu_complete"
        android:showAsAction="ifRoom"
        android:icon="@android:drawable/ic_menu_camera" />
    <item
        android:id="@+id/menu_search"
        android:orderInCategory="1"
        android:title="@string/menu_complete"
        android:showAsAction="ifRoom"
        android:icon="@android:drawable/ic_secure" />
</menu>

をres/menu/に「hoge1.xml」て名前で保存して

Activityに

    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        getMenuInflater().inflate(R.menu.hoge1, menu);

        return true;
    }

を記載すれば、ActionBarにボタンが2つ並びます。。。

でもやりたいことはそうじゃななくて
常に「≡」を表示させたい!!!

XMLに記載されているitemの属性の
showAsAction="ifRoom"
のところを
always:常に表示 にしたり
withText:テキストも表示 にしたり

いろいろ試してみましたが、「≡」が表示されませんorz

調べてみると、ActionBarに表示するボタンて、物理ボタンを意識した
ボタンらしい、戻るボタンとかカメラボタンとか・・・・

エミュレータを使って開発しているとよくわかると思いますが、
画面の横とかにキーボードとか、カメラのボタンがついていますよね・・・
あのボタンが存在すると、「≡」を表示しない仕様らしい。。

実機のGalaxyとかでやると表示されるのかな・・・?
エミュレータで開発してる手前、はまりました・・・
物理ボタン気にしてなかったですorz

それはともかく対応としては、以下になります。

対応内容

    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        try
        {
            ViewConfiguration config = ViewConfiguration.get(this);
            Field menuKeyField 
              = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");
            if (menuKeyField != null)
            {
                menuKeyField.setAccessible(true);
                menuKeyField.setBoolean(config, false);
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        getMenuInflater().inflate(R.menu.hoge1, menu);

        return true;
    }

てな感じでtry catchに囲まれた部分を追加します。
これは強制的に物理キーがありませんよ・・・ていう処理ですね、、、

そしてXMLのandroid:showAsAction属性を
never:常に表示しない
にします。

これにより無事、「≡」が表示され定義したメニューがすべて「≡」に収まりました。

やった!!

以上

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away