Share via


工具列相容性

概觀

本節說明如何在 Android 5.0 Lollipop 之前的 Android 版本上使用 Toolbar 。 如果您的應用程式不支援 Android 5.0 之前的 Android 版本,您可以略過本節。

因為 Toolbar 是 Android v7 支援連結庫的一部分,所以可以在執行 Android 2.1 (API 層級 7) 和更新版本的裝置上使用。 不過, 必須安裝 Android 支援連結庫 v7 AppCompat NuGet 並修改程式代碼,使其使用 Toolbar 此連結庫中提供的實作。 本節說明如何安裝此 NuGet,並從新增第二個工具列修改 ToolbarFun 應用程式,使其在 Lollipop 5.0 之前的 Android 版本上執行。

若要修改應用程式以使用工具列的 AppCompat 版本:

  1. 設定應用程式的 [最低] 和 [目標 Android 版本]。

  2. 安裝 AppCompat NuGet 套件。

  3. 使用 AppCompat 主題,而不是內建的 Android 主題。

  4. 變更 MainActivity ,使其子類別 AppCompatActivity 化,而不是 Activity

下列各節將詳細說明這些步驟。

設定 [最低] 和 [目標 Android 版本]

應用程式的目標 Framework 必須設定為 API 層級 21 或更新版本,否則應用程式將無法正確部署。 如果在部署應用程式時看到套件 『android』 中找不到屬性 『tileModeX』 的資源識別碼之類的錯誤,這是因為目標 Framework 未設定為 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 連結庫隨附數 Theme.AppCompat 個主題,可用於AppCompat連結庫所支援的任何 Android 版本。 範例 ToolbarFun 應用程式主題衍生自 Theme.Material.Light.DarkActionBar,這不適用於早於Lollipop的Android版本。 因此,ToolbarFun必須調整為使用此主題的 AppCompat 對應專案。 Theme.AppCompat.Light.DarkActionBar 此外,由於 Toolbar 無法在 Lollipop 之前的 Android 版本上使用,因此我們必須使用的 ToolbarAppCompat 版本。 因此,版面設定必須使用 android.support.v7.widget.Toolbar ,而不是 Toolbar

更新版面配置

編輯 Resources/layout/Main.axml ,並以下列 XML 取代 Toolbar 元素:

<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 連結庫參考。 由於此範例使用 actionBarSize AppCompat連結庫所定義的 ,因此會卸除前置 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>

此範例中的專案名稱和父主題不再前面加上 android: ,因為我們使用AppCompat連結庫。 此外,父主題也會變更為的 Light.DarkActionBarAppCompat版本。

更新功能表

為了支援舊版 Android,AppCompat 連結庫會使用鏡像命名空間屬性的 android: 自定義屬性。 不過,某些屬性(例如 showAsAction 標籤中使用的 <menu> 屬性)不存在於舊版裝置上的 Android 架構中– showAsAction 是在 Android API 11 中引進,但在 Android API 7 中無法使用。 基於這個理由,自定義命名空間必須用來為支持連結庫所定義的所有屬性加上前置詞。 在功能表資源檔中,會定義名為 local 的命名空間,以便為 屬性加上 showAsAction 前置詞。

編輯 資源/功能表/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 前面會加上這個 local: 命名空間,而不是 android:

local:showAsAction="ifRoom"

同樣地,編輯 [資源/功能表/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>

此命名空間參數如何支援 showAsAction API 層級 11 之前的 Android 版本屬性? 安裝 AppCompat NuGet 時,自訂屬性 showAsAction 及其所有可能的值都會包含在應用程式中。

子類別 AppCompatActivity

轉換的最後一個步驟是修改 MainActivity ,使其是 的 AppCompatActivity子類別。 編輯 MainActivity.cs 並新增下列 using 語句:

using Android.Support.V7.App;
using Toolbar = Android.Support.V7.Widget.Toolbar;

這會宣告 Toolbar 為的 ToolbarAppCompat 版本。 接下來,變更的 MainActivity類別定義:

public class MainActivity : AppCompatActivity

若要將動作列設定為的 ToolbarAppCompat 版本,請將 的呼叫 SetActionBar 取代為 SetSupportActionBar。 在此範例中,標題也會變更,以指出正在使用的AppCompat版本 Toolbar

SetSupportActionBar (toolbar);
SupportActionBar.Title = "My AppCompat Toolbar";

最後,將 [最低 Android] 層級變更為所要支援的 Lollipop 前值(例如,API 19)。

建置應用程式並在預先 Lollipop 裝置或 Android 模擬器上執行。 下列螢幕快照顯示執行 KitKat 的 Nexus 4 上 ToolbarFunAppCompat 版本(API 19):

在 KitKat 裝置上執行之應用程式的完整螢幕快照,會顯示這兩個工具列

使用 AppCompat 連結庫時,不需要根據 Android 版本切換主題 – AppCompat 連結庫可讓您在所有支援的 Android 版本之間提供一致的用戶體驗。