画面回転時のActionBarの挙動まとめ

はじめに

ActionBarの一部の機能は、端末の画面の向きによって挙動が異なる場合があります。 この記事では特に画面回転時に大きく挙動が変わる部分についてまとめました。

MenuItemの表示数が変わる

ActionBarに表示されるMenuItemの数は画面幅のdpによって決定されています。 ActionBarでタイトルなどが表示されるバーのことをメインアクションバーと呼びますが、 このメインアクションバーにMenuItemを表示する場合、全幅の50%を超えない範囲で表示数が決められています。 メインアクションバーにおけるdpMenuItem表示数の関係は以下のようになっています。

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によりメインアクションバーにタブの内容が入りきらない場合、タブバーの内容はドロップダウンリストとして表示されます。 このとき、MenuItemapp: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