画面回転時のActionBarの挙動まとめ
はじめに
ActionBar
の一部の機能は、端末の画面の向きによって挙動が異なる場合があります。
この記事では特に画面回転時に大きく挙動が変わる部分についてまとめました。
MenuItemの表示数が変わる
ActionBar
に表示されるMenuItem
の数は画面幅のdp
によって決定されています。
ActionBar
でタイトルなどが表示されるバーのことをメインアクションバーと呼びますが、
このメインアクションバーにMenuItem
を表示する場合、全幅の50%を超えない範囲で表示数が決められています。
メインアクションバーにおけるdp
とMenuItem
表示数の関係は以下のようになっています。
dp | Menu表示数 |
---|---|
-359 | 2 |
360-499 | 3 |
500-599 | 4 |
600- | 5 |
http://developer.android.com/design/patterns/actionbar.html
下記スクリーンショットはGalaxyNexus
での例です。
縦向きでは(オーバーフローを含めて)3つ、横向きでは4つ表示されています。
タイトル非表示の場合
ロゴおよびタイトルを非表示にした場合でもメインアクションバーのメニューの表示数は増えません。
final ActionBar actionbar = getSupportActionBar(); actionbar.setDisplayShowTitleEnabled(false); actionbar.setDisplayShowHomeEnabled(false);
分割アクションバーの統合
AndroidManifest.xml
に設定を記述することで、縦向き時のActionBar
の要素を分割することができます。
これにより画面下部では横幅いっぱいにMenuItem
を表示することができますが、横向き時にはすべてメインアクションバーに格納されてしまいます。
<manifest > <activity uiOptions="splitActionBarWhenNarrow" > <meta-data android:name="android.support.UI_OPTIONS" android:value="splitActionBarWhenNarrow" /> </activity> </manifest>
タブが格納される
ActionBar
のナビゲーションモードをNAVIGATION_MODE_TABS
にしている場合、画面が縦向きであればメインアクションバーの下にタブバーが表示されます。
画面が横向きの場合、このタブバーはメインアクションバーに格納されます。
また、横向き時にメインアクションバーにタブの内容が表示しきれない場合、NAVIGATION_MODE_LIST
に似た表示に変更されます。
final ActionBar actionbar = getSupportActionBar(); actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); actionbar.addTab(actionbar.newTab().setText("ほげほげ").setTabListener(listener)); actionbar.addTab(actionbar.newTab().setText("ぴよぴよ").setTabListener(listener)); actionbar.addTab(actionbar.newTab().setText("かにかに").setTabListener(listener)); actionbar.addTab(actionbar.newTab().setText("えびえび").setTabListener(listener));
タブ要素を表示できる場合
メインアクションバーにタブの内容が入りきる場合、タブバーの内容はそのままメインアクションバーに表示されます。
タブ要素を表示できない場合
タイトルやMenuItem
によりメインアクションバーにタブの内容が入りきらない場合、タブバーの内容はドロップダウンリストとして表示されます。
このとき、MenuItem
をapp:showAsAction="ifRoom"
としていてもMenuItem
の表示のほうが優先されます。
タブ+分割
アクションバーの分割とタブ表示を両方行っていた場合、どちらの要素もメインアクションバーに格納されます。
タイトル非表示の場合
ロゴおよびタイトルを非表示にした場合、タブ要素は左詰めで表示されます。 画像では分割アクションバーですが、分割していない場合でも同様です。
final ActionBar actionbar = getSupportActionBar(); actionbar.setDisplayShowTitleEnabled(false); actionbar.setDisplayShowHomeEnabled(false);
ドロップダウンは特に変化なし
ActionBar
のナビゲーションモードをNAVIGATION_MODE_LIST
にしている場合、画面の向きにかかわらずメインアクションバーにドロップダウンメニューが表示されます。
final ActionBar actionbar = getSupportActionBar(); actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); actionbar.setListNavigationCallbacks(new ArrayAdapter<String>( MyActivity.this,R.layout.list_item, new String[]{"ほげほげ","ぴよぴよ","かにかに","えびえび"}), new ActionBar.OnNavigationListener() { @Override public boolean onNavigationItemSelected(int i, long l) { return false; } });
参考資料
ActionBar
の表示に関する挙動は以下のURLに書いてあります。
http://developer.android.com/design/patterns/actionbar.html
http://developer.android.com/guide/topics/ui/actionbar.html