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:常に表示しない
にします。
これにより無事、「≡」が表示され定義したメニューがすべて「≡」に収まりました。
やった!!
以上