次の方法で共有


ツール バーの互換性

概要

このセクションでは、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 バージョンのツール バーを使用するようにアプリを変更するには、次の操作を行います。

  1. アプリの最小およびターゲットの Android バージョンを設定します。

  2. AppCompat NuGet パッケージをインストールします。

  3. 組み込みの Android テーマの代わりに AppCompat テーマを使用します。

  4. 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 パッケージの管理] 内で選択されている V7 Appcompat パッケージのスクリーンショット

この NuGet がインストールされると、まだ存在しない場合は、他のいくつかの NuGet パッケージもインストールされます (Xamarin.Android.Support.Animated.Vector.DrawableXamarin.Android.Support.v4Xamarin.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;

これは、ToolbarToolbar の 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 バージョンを示しています。

KitKat デバイスで実行されているアプリの完全なスクリーンショット。両方のツール バーが表示されています

AppCompat ライブラリを使用する場合、Android バージョンに基づいてテーマを切り替える必要はありません。AppCompat ライブラリを使用すると、サポートされているすべての Android バージョンで一貫したユーザー エクスペリエンスが得られます。