画面回転時の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つ表示されています。

<img src="https://qiita-image-store.s3.amazonaws.com/0/48019/75d364f5-5b1a-4580-3107-94f02bd914db.png" width="240" />　<img src="https://qiita-image-store.s3.amazonaws.com/0/48019/5da4657e-d35f-a2d1-9e17-2a42a2cae353.png" width="360" />


## タイトル非表示の場合
ロゴおよびタイトルを非表示にした場合でもメインアクションバーのメニューの表示数は増えません。

```java
final ActionBar actionbar = getSupportActionBar();
actionbar.setDisplayShowTitleEnabled(false);
actionbar.setDisplayShowHomeEnabled(false);
```
<img src="https://qiita-image-store.s3.amazonaws.com/0/48019/dfd1752a-f3d2-208c-7e0c-6844621873fc.png" width="240" />　<img src="https://qiita-image-store.s3.amazonaws.com/0/48019/ce6a94cd-acde-7fb8-796a-afd3b08a2755.png" width="360"/>

# 分割アクションバーの統合
`AndroidManifest.xml`に設定を記述することで、縦向き時の`ActionBar`の要素を分割することができます。
これにより画面下部では横幅いっぱいに`MenuItem`を表示することができますが、**横向き時にはすべてメインアクションバーに格納されてしまいます。**

```AndroidManifest.xml
<manifest >
    <activity uiOptions="splitActionBarWhenNarrow"  >
        <meta-data android:name="android.support.UI_OPTIONS"
                   android:value="splitActionBarWhenNarrow" />
    </activity>
</manifest>
```

<img src="https://qiita-image-store.s3.amazonaws.com/0/48019/f385a508-1163-d2bf-acf1-021cec383eb3.png" width="240" />　<img src="https://qiita-image-store.s3.amazonaws.com/0/48019/b9f9a103-c57f-cf81-26f6-14eba088e178.png" width="360" />

# タブが格納される
`ActionBar`のナビゲーションモードを`NAVIGATION_MODE_TABS`にしている場合、画面が縦向きであればメインアクションバーの下にタブバーが表示されます。
**画面が横向きの場合、このタブバーはメインアクションバーに格納されます。**
また、横向き時にメインアクションバーにタブの内容が表示しきれない場合、`NAVIGATION_MODE_LIST`に似た表示に変更されます。

```java
    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));
```

## タブ要素を表示できる場合
メインアクションバーにタブの内容が入りきる場合、タブバーの内容はそのままメインアクションバーに表示されます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/48019/a545725b-e60b-eb41-0122-6d80681e00bd.png" width="240" />　<img src="https://qiita-image-store.s3.amazonaws.com/0/48019/0a67f0af-689a-ee7c-05c9-f9a7a08826eb.png" width="360" />

## タブ要素を表示できない場合
タイトルや`MenuItem`によりメインアクションバーにタブの内容が入りきらない場合、タブバーの内容はドロップダウンリストとして表示されます。
このとき、`MenuItem`を`app:showAsAction="ifRoom"`としていても`MenuItem`の表示のほうが優先されます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/48019/db1c241d-74a2-44d9-9b78-7ee8b3822b3d.png" width="240" />　<img src="https://qiita-image-store.s3.amazonaws.com/0/48019/03377305-bf0d-43f2-e596-da1a533811a1.png" width="360" />

## タブ+分割
アクションバーの分割とタブ表示を両方行っていた場合、どちらの要素もメインアクションバーに格納されます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/48019/f35c31fa-476a-dbd7-723a-2ba8ab69d04f.png" width="240" />　<img src="https://qiita-image-store.s3.amazonaws.com/0/48019/b12e7d85-a106-d586-2ae5-0ea1d44a9f39.png" width="360" />


## タイトル非表示の場合
ロゴおよびタイトルを非表示にした場合、タブ要素は左詰めで表示されます。
画像では分割アクションバーですが、分割していない場合でも同様です。

```java
final ActionBar actionbar = getSupportActionBar();
actionbar.setDisplayShowTitleEnabled(false);
actionbar.setDisplayShowHomeEnabled(false);
```

<img src="https://qiita-image-store.s3.amazonaws.com/0/48019/e7355656-d6be-035c-e853-875773769482.png" width="240" />　<img src="https://qiita-image-store.s3.amazonaws.com/0/48019/59d5f937-abd8-c642-5ac0-573b18144d07.png" width="360" />

# ドロップダウンは特に変化なし
`ActionBar`のナビゲーションモードを`NAVIGATION_MODE_LIST`にしている場合、画面の向きにかかわらずメインアクションバーにドロップダウンメニューが表示されます。

```java
    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;
        }
    });
```

<img src="https://qiita-image-store.s3.amazonaws.com/0/48019/5de1831e-ba2d-2625-b218-521cea8a7382.png" width="240" />　<img src="https://qiita-image-store.s3.amazonaws.com/0/48019/496c98d3-d332-237a-6192-0b667c491df9.png" width="360" />

# 参考資料
`ActionBar`の表示に関する挙動は以下のURLに書いてあります。
http://developer.android.com/design/patterns/actionbar.html
http://developer.android.com/guide/topics/ui/actionbar.html