LoginSignup
8
9

More than 5 years have passed since last update.

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

Posted at

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:常に表示しない
にします。

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

やった!!

以上

8
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
9