2012/07/09

Android:Menuボタンの廃止とActionBar


Android3.0 (Honeycomb)以前のアンドロイド端末はMenuボタンを備える必要がありました。
しかし、Android3.0で物理的なMenuボタンへの依存が排除されたため、Menuボタンを持た
ない端末が登場しました。


●Honeycomb以降のMenuボタンに変わるもの

Honeycomb以降は物理的なMenuボタンを持つ、あるいは持たない端末の両方をサポートする必要があります。(Menuキーを持たない端末としてGalaxy Nexusがあります)

Honeycomb以降でもオプションメニューはサポートされています。
オプションメニューにアクセスするためのUIとしてMenuボタンの代わりにActionButtonとOverflowButtonが用意されました。



●Gingerbread以前との互換性

Menuボタンを持たない端末でGingerbread以前を対象としたアプリを動作させた場合、
システムバー(Honeycomb)、ナビゲーションバー(ICS or later)にMenuボタンが表示されます。
※本稿ではActionBarのOverflowButtonと区別するためLegacyOverflowButtonと表記

(IceCreamSandwitch - ナビゲーションバー)
(Honeycomb - システムバー)

●表示されるのはOverflowButtonか?LegacyOverflowButtonか?

AndroidはOverflowMenuを表示すべきか、LegacyOverflowButtonを表示すべきかをアプリ
のuses-sdkタグで判断します。
  • targetSdkVersionが11以上(Honeycomb以降)の場合、LegacyOverflowButtonを非表示
  • これ以外の場合、Android3.0以降の端末ではLegacyOverflowButtonを表示
  • ただし、下記を全て満たす場合は例外的にLegacyMenuButtonを表示
     - minSdkVersionが10以前(つまりGingerbread以前)
     - targetSdkVersionが11~13(つまりHoneycomb~HoneycombMR2)
     - ActionBarを使用しない
     - Android4.0以降のスーマートフォン(ハンドセット)端末で実行
最後の例外については"Gingerbread以前のハンドセットとHoneycombのタブレットをサポ
ートするアプリ"と判断され、Menuキーが必要であると判断されます。

まとめると、
  • Honeycomb以降をサポートするアプリはOverflowMenuをサポートすること
  • Honeycombより前をサポートするアプリはLegacyOverflowButtonを表示
  • Gingerbread以前~HoneycombまでをサポートするアプリはLegacyOverflowButtonを表示
となります。

実際にどのように表示されるのかを下記にまとめます。

【Honeycomb以降のMenuボタンを持たない端末で...】
・Honeycomb以降をターゲットにしたアプリ
オプションメニューはActionBar内にあるActionButtonあるいはActionOverflowに集約さ
れます。ユーザはこれらのUIを通してオプションメニューにアクセスします。


・Honeycombより前をターゲットにしたアプリ
ナビゲーションバーにlegacyOverflowButtonを表示します。
これにより、Honeycomb以前をターゲットにしたアプリとの互換性を保ちます。


・Honeycombをターゲットにしたアプリ
下記全てを満たすアプリはナビゲーションバーにLegacyOverflowButtonが表示されます。
 - minSdkVersionが10以前(つまりGingerbread以前)
 - targetSdkVersionが11~13(つまりHoneycomb)
 - ActionBarを使用しない
 - Android4.0以降のスーマートフォン(ハンドセット)端末で実行

下記全てを満たすアプリは、ユーザがオプションメニューにアクセスできなくなります。
 - minSdkVersionが10以前(つまりGingerbread以前)
 - targetSdkVersionが11~13(つまりHoneycomb)
 - ActionBarを使用しない
 - Android3.x系タブレット端末で実行


・ICSをターゲットにしたアプリ
下記全てを満たすアプリは、ユーザがオプションメニューにアクセスできなくなります。
 - targetSdkVersionが14以上(つまりICS以降)
 - ActionBarを使用しない
 - Menuキーを搭載しない端末で実行


【Honeycomb以降のMenuボタンを持つ端末で...】
・Honeycomb以降をターゲットにしたアプリ
ユーザはMenuボタンを通してオプションメニューにアクセスします。
従来(Honeycombより前)と同じスタイルですが、いくつかのメニューアイテムを
ActionButtonとして提供することも可能です。



●Gingerbread以前~Honeycomb以降をサポートする

Honeycomb以降はActionBarを備えている必要があります。
しかしながら、Gingerbread以前はActionBarが搭載されていません。
この差を埋めるテクニックにシステムバージョン修飾子を使用したものがあります。

サンプルコード
・res/values/styles.xml
<resources>
    <style name="AppTheme" parent="android:Theme.Light" />
</resources>
・res/values-v11/styles.xml
<resources>
    <style name="AppTheme" parent="android:Theme.Holo.Light" />
</resources>
・AndroidManifest.xml
<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
以上です。