2012/07/10

Android:splitActionBarWhenNarrowでActionBarが分割されなくなる条件


ActionBarで、タブモードやリストモードとActionボタンを併用すると、表示スペースが足
りなくなることがよくあります。
これを解決する方法の1つにsplitActionBarWhenNarrowがあります。

splitActionBarWhenNarrowは、ActionBarに十分な表示領域が無い場合、
画面の上下にActionBarを分割してくれるUIオプションです。
実際に分割された画面は図1のようになります。
しかし、分割されない場合もあります(図2)

図1

図2
ほとんどの端末で横画面にするとActionBarが分割されません。
なぜでしょう?

●ActionBarが分割されない条件は?

splitActionBarWhenNarrowでActionBarを分割するには画面横幅480dp以上必要です。

ActionBarを分割するか否かを判断するロジックは、
com.android.internal.policy.impl.PhoneWindow.installDecorメソッドにあります。
if (splitWhenNarrow) {
    splitActionBar = getContext().getResources().getBoolean(
            com.android.internal.R.bool.split_action_bar_is_narrow);
boolリソースのsplit_action_bar_is_narrow値を読み込んでいるのがわかりますね。
このbool値は、下記のように定義されています。

・framework/base/core/res/res/values/bools.xml
<resources>
...
    <bool name="split_action_bar_is_narrow">true</bool>
</resources>
・framework/base/core/res/res/values-w480dp/bools.xml
<resources>
...
    <bool name="split_action_bar_is_narrow">false</bool>
</resources>
つまり、画面横幅が480dp以上ある場合はfalse(分割されない)というわけです。


●おわりに...

本当にw480dp未満であれば横画面でも分割されるのか試してみました。

QVGA(240x320 / Low dpi)のスキンで確認した結果↓



ちゃんと分割されますね。

以上です。