工具列相容性
概觀
本節說明如何在 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 版本:
設定應用程式的 [最低] 和 [目標 Android 版本]。
安裝 AppCompat NuGet 套件。
使用 AppCompat 主題,而不是內建的 Android 主題。
變更
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 時,如果尚未存在,也會安裝其他數個 NuGet 套件(例如 Xamarin.Android.Support.Animated.Vector.Drawable、Xamarin.Android.Support.v4 和 Xamarin.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 版本上使用,因此我們必須使用的 Toolbar
AppCompat 版本。 因此,版面設定必須使用 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.DarkActionBar
AppCompat版本。
更新功能表
為了支援舊版 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
為的 Toolbar
AppCompat 版本。 接下來,變更的 MainActivity
類別定義:
public class MainActivity : AppCompatActivity
若要將動作列設定為的 Toolbar
AppCompat 版本,請將 的呼叫 SetActionBar
取代為 SetSupportActionBar
。 在此範例中,標題也會變更,以指出正在使用的AppCompat版本 Toolbar
:
SetSupportActionBar (toolbar);
SupportActionBar.Title = "My AppCompat Toolbar";
最後,將 [最低 Android] 層級變更為所要支援的 Lollipop 前值(例如,API 19)。
建置應用程式並在預先 Lollipop 裝置或 Android 模擬器上執行。 下列螢幕快照顯示執行 KitKat 的 Nexus 4 上 ToolbarFun 的 AppCompat 版本(API 19):
使用 AppCompat 連結庫時,不需要根據 Android 版本切換主題 – AppCompat 連結庫可讓您在所有支援的 Android 版本之間提供一致的用戶體驗。