ツール バーの互換性
概要
このセクションでは、Android 5.0 Lollipop 以前のバージョンの Android で Toolbar
を使用する方法について説明します。 アプリで Android 5.0 以前のバージョンの Android がサポートされていない場合は、このセクションをスキップできます。
Toolbar
は Android v7 サポート ライブラリの一部であるため、Android 2.1 (API レベル 7) 以降を実行しているデバイスで使用できます。 ただし、Android サポート ライブラリ v7 AppCompat NuGet をインストールし、このライブラリで提供されている Toolbar
の実装を使用するようにコードを変更する必要があります。 このセクションでは、この NuGet をインストールし、2 つ目のツール バーの追加から ToolbarFun アプリを変更して、Lollipop 5.0 以前の Android バージョンで実行されるようにする方法について説明します。
AppCompat バージョンのツール バーを使用するようにアプリを変更するには、次の操作を行います。
アプリの最小およびターゲットの Android バージョンを設定します。
AppCompat NuGet パッケージをインストールします。
組み込みの Android テーマの代わりに AppCompat テーマを使用します。
Activity
ではなくAppCompatActivity
をサブクラス化するようにMainActivity
を変更します。
これらの各手順の詳細について、次のセクションで説明します。
最小およびターゲットの Android バージョンを設定する
アプリのターゲット フレームワークを API レベル 21 以上に設定しないと、アプリが正しくデプロイされません。 アプリのデプロイ中に「パッケージ 'android' で属性 'tileModeX' のリソース識別子が見つかりません」などのエラーが表示された場合は、ターゲット フレームワークが Android 5.0 (API レベル 21 - Lollipop) 以上に設定されていないことが原因です。
ターゲット フレームワーク レベルを API レベル 21 以上に設定し、Android API レベルのプロジェクト設定をアプリでサポートされる最小の Android バージョンに設定します。 Android API レベルの設定の詳細については、「Android API レベルの理解」を参照してください。
ToolbarFun
の例では、Android の最小バージョンが KitKat (API レベル 4.4) に設定されています。
AppCompat NuGet パッケージをインストールする
次に、Android サポート ライブラリ v7 AppCompat パッケージをプロジェクトに追加します。 Visual Studio で、[参照] を右クリックし、[NuGet パッケージの管理...] を選びます。[参照] をクリックし、「Android サポート ライブラリ v7 AppCompat」を検索します。 Xamarin.Android.Support.v7.AppCompat を選択し、[インストール] をクリックします。
この NuGet がインストールされると、まだ存在しない場合は、他のいくつかの NuGet パッケージもインストールされます (Xamarin.Android.Support.Animated.Vector.Drawable、Xamarin.Android.Support.v4、Xamarin.Android.Support.Vector.Drawable など)。 NuGet パッケージのインストールについて詳しくは、プロジェクトへの NuGet の組み込みに関するチュートリアルの記事をご覧ください。
AppCompat テーマとツール バーを使用する
AppCompat ライブラリには、AppCompat ライブラリでサポートされている任意のバージョンの Android で使用できるいくつかの Theme.AppCompat
テーマが付属しています。 ToolbarFun
のアプリ テーマの例は Theme.Material.Light.DarkActionBar
から派生したもので、Lollipop 以前の Android バージョンでは利用できません。 したがって、ToolbarFun
は、このテーマ (Theme.AppCompat.Light.DarkActionBar
) に対応する AppCompat を使用するように適合させる必要があります。 また、Toolbar
は Lollipop 以前のバージョンの Android では使用できないため、Toolbar
の AppCompat バージョンを使用する必要があります。 したがって、レイアウトには Toolbar
の代わりに android.support.v7.widget.Toolbar
を使用する必要があります。
レイアウトの更新
Resources/layout/Main.axml を編集し、Toolbar
要素を次の XML に置き換えます。
<android.support.v7.widget.Toolbar
android:id="@+id/edit_toolbar"
android:minHeight="?attr/actionBarSize"
android:background="?attr/colorAccent"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
Resources/layout/toolbar.xml を編集し、その内容を次の XML に置き換えます。
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?attr/actionBarSize"
android:background="?attr/colorPrimary"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/>
?attr
値の前に android:
を含むプレフィックスが付かなくなったことに注意してください (?
の表記が現在のテーマのリソースを参照していることを思い出してください)。 ここで ?android:attr
が引き続き使用されていた場合、Android は AppCompat ライブラリからではなく、現在実行中のプラットフォームからの属性値を参照します。 この例では、AppCompat ライブラリによって定義された actionBarSize
を使用するため、android:
プレフィックスは削除されます。 同様に、@android:style
は @style
に変更され、android:theme
属性は AppCompat ライブラリのテーマに設定されます。ThemeOverlay.AppCompat.Dark.ActionBar
テーマは、ThemeOverlay.Material.Dark.ActionBar
ではなくここで使用されます。
スタイルを更新する
Resources/values/styles.xml を編集し、その内容を次の XML に置き換えます。
<?xml version="1.0" encoding="utf-8" ?>
<resources>
<style name="MyTheme" parent="MyTheme.Base"> </style>
<style name="MyTheme.Base" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="windowNoTitle">true</item>
<item name="windowActionBar">false</item>
<item name="colorPrimary">#5A8622</item>
<item name="colorAccent">#A88F2D</item>
</style>
</resources>
AppCompat ライブラリを使用しているため、この例では項目名と親テーマのプレフィックスが android:
ではなくなっています。
また、親テーマは Light.DarkActionBar
の AppCompat バージョンに変更されます。
メニューの更新
以前のバージョンの Android をサポートするために、AppCompat ライブラリでは、android:
名前空間の属性をミラーリングするカスタム属性が使用されます。 ただし、一部の属性 (<menu>
タグで使用される showAsAction
属性など) は、古いデバイス上の Android フレームワークには存在しません。showAsAction
は Android API 11 で導入されましたが、Android API 7 では使用できません。 このため、サポート ライブラリで定義されているすべての属性のプレフィックスには、カスタム名前空間を使用する必要があります。 メニュー リソース ファイルでは、showAsAction
属性のプレフィックスとして local
という名前空間が定義されています。
Resources/menu/top_menus.xml を編集し、その内容を次の XML に置き換えます。
<?xml version="1.0" encoding="utf-8" ?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:local="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/menu_edit"
android:icon="@mipmap/ic_action_content_create"
local:showAsAction="ifRoom"
android:title="Edit" />
<item
android:id="@+id/menu_save"
android:icon="@mipmap/ic_action_content_save"
local:showAsAction="ifRoom"
android:title="Save" />
<item
android:id="@+id/menu_preferences"
local:showAsAction="never"
android:title="Preferences" />
</menu>
local
名前空間は次の行で追加されます。
xmlns:local="http://schemas.android.com/apk/res-auto">
showAsAction
属性の前には、android:
ではなくこの local:
名前空間が付きます。
local:showAsAction="ifRoom"
Resources/menu/edit_menus.xml を編集し、その内容を次の XML に置き換えます。
<?xml version="1.0" encoding="utf-8" ?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:local="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/menu_cut"
android:icon="@mipmap/ic_menu_cut_holo_dark"
local:showAsAction="ifRoom"
android:title="Cut" />
<item
android:id="@+id/menu_copy"
android:icon="@mipmap/ic_menu_copy_holo_dark"
local:showAsAction="ifRoom"
android:title="Copy" />
<item
android:id="@+id/menu_paste"
android:icon="@mipmap/ic_menu_paste_holo_dark"
local:showAsAction="ifRoom"
android:title="Paste" />
</menu>
この名前空間スイッチは、API レベル 11 以前の Android バージョンで showAsAction
属性をどのようにサポートしますか? AppCompat NuGet がインストールされると、カスタム属性 showAsAction
とその使用可能なすべての値がアプリに含まれます。
AppCompatActivity のサブクラス化
変換の最後の手順は、それが AppCompatActivity
のサブクラスになるように MainActivity
を変更することです。 MainActivity.cs を編集し、次の using
ステートメントを追加します。
using Android.Support.V7.App;
using Toolbar = Android.Support.V7.Widget.Toolbar;
これは、Toolbar
が Toolbar
の AppCompat バージョンであることを宣言します。 次に、次の MainActivity
のクラス定義を変更します。
public class MainActivity : AppCompatActivity
アクション バーを Toolbar
の AppCompat バージョンに設定するには、SetActionBar
への呼び出しを SetSupportActionBar
に置き換えます。 この例では、Toolbar
の AppCompat バージョンが使用されていることを示すようにタイトルも変更されています。
SetSupportActionBar (toolbar);
SupportActionBar.Title = "My AppCompat Toolbar";
最後に、最小の Android レベルを、サポートされる Lollipop 以前の値 (API 19 など) に変更します。
アプリをビルドし、Lollipop 以前のデバイスまたは Android エミュレーターで実行します。 次のスクリーンショットは、KitKat (API 19) を実行している Nexus 4 上の ToolbarFun の AppCompat バージョンを示しています。
AppCompat ライブラリを使用する場合、Android バージョンに基づいてテーマを切り替える必要はありません。AppCompat ライブラリを使用すると、サポートされているすべての Android バージョンで一貫したユーザー エクスペリエンスが得られます。