Posted at

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

More than 3 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:常に表示しない

にします。

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

やった!!

以上