Zgodność paska narzędzi
Omówienie
W tej sekcji wyjaśniono, jak używać Toolbar
w wersjach systemu Android starszych niż Android 5.0 Lollipop. Jeśli aplikacja nie obsługuje wersji systemu Android starszych niż Android 5.0, możesz pominąć tę sekcję.
Ponieważ Toolbar
jest częścią biblioteki obsługi systemu Android w wersji 7, można jej używać na urządzeniach z systemem Android 2.1 (poziom 7 interfejsu API) i nowszym. Należy jednak zainstalować bibliotekę pomocy technicznej systemu Android w wersji 7 AppCompat NuGet i zmodyfikować kod tak, aby korzystał z implementacji podanej Toolbar
w tej bibliotece. W tej sekcji wyjaśniono, jak zainstalować ten pakiet NuGet i zmodyfikować aplikację ToolbarFun z sekcji Dodawanie drugiego paska narzędzi , aby była uruchamiana w wersjach systemu Android starszych niż Lollipop 5.0.
Aby zmodyfikować aplikację tak, aby korzystała z wersji AppCompat paska narzędzi:
Ustaw minimalną i docelową wersję systemu Android dla aplikacji.
Zainstaluj pakiet NuGet AppCompat.
Użyj motywu AppCompat zamiast wbudowanego motywu systemu Android.
Zmodyfikuj
MainActivity
tak, aby podklasyAppCompatActivity
, a nieActivity
.
Każdy z tych kroków został szczegółowo opisany w poniższych sekcjach.
Ustawianie minimalnej i docelowej wersji systemu Android
Platforma docelowa aplikacji musi być ustawiona na poziom 21 interfejsu API lub nowszą lub aplikacja nie zostanie prawidłowo wdrożona. Jeśli podczas wdrażania aplikacji jest wyświetlany błąd, taki jak Brak identyfikatora zasobu dla atrybutu "tileModeX" w pakiecie "android" , jest to spowodowane tym, że platforma docelowa nie jest ustawiona na android 5.0 (poziom interfejsu API 21 — Lollipop) lub nowszą.
Ustaw poziom platformy docelowej na poziom API Level 21 lub nowszy i ustaw ustawienia projektu na poziomie interfejsu API systemu Android na minimalną wersję systemu Android, którą aplikacja ma obsługiwać. Aby uzyskać więcej informacji na temat ustawiania poziomów interfejsu API systemu Android, zobacz Opis poziomów interfejsu API systemu Android.
W tym przykładzie ToolbarFun
minimalna wersja systemu Android jest ustawiona na KitKat (poziom interfejsu API 4.4).
Instalowanie pakietu NuGet AppCompat
Następnie dodaj do projektu pakiet AppCompat biblioteki pomocy technicznej systemu Android w wersji 7. W programie Visual Studio kliknij prawym przyciskiem myszy pozycję Odwołania i wybierz polecenie Zarządzaj pakietami NuGet.... Kliknij pozycję Przeglądaj i wyszukaj pozycję Biblioteka pomocy technicznej systemu Android w wersji 7 AppCompat. Wybierz pozycję Xamarin.Android.Support.v7.AppCompat i kliknij pozycję Zainstaluj:
Po zainstalowaniu tego pakietu NuGet zainstalowano również kilka innych pakietów NuGet, jeśli jeszcze ich nie ma (takich jak Xamarin.Android.Support.Animated.Vector.Drawable, Xamarin.Android.Support.v4 i Xamarin.Android.Support.Vector.Drawable). Aby uzyskać więcej informacji na temat instalowania pakietów NuGet, zobacz Przewodnik: dołączanie pakietu NuGet w projekcie.
Używanie motywu i paska narzędzi AppCompat
Biblioteka AppCompat zawiera kilka Theme.AppCompat
motywów, których można używać w dowolnej wersji systemu Android obsługiwanej przez bibliotekę AppCompat. Przykładowy ToolbarFun
motyw aplikacji pochodzi z Theme.Material.Light.DarkActionBar
elementu , który nie jest dostępny w wersjach systemu Android wcześniejszych niż Lollipop. ToolbarFun
W związku z tym należy dostosować go do używania odpowiednika AppCompat dla tego motywu. Theme.AppCompat.Light.DarkActionBar
Ponadto, ponieważ Toolbar
nie jest dostępna w wersjach systemu Android starszych niż Lollipop, musimy użyć wersji AppCompat programu Toolbar
. W związku z tym układy muszą być używane android.support.v7.widget.Toolbar
zamiast Toolbar
.
Aktualizowanie układów
Edytuj element Resources/layout/Main.axml i zastąp Toolbar
element następującym kodem 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" />
Edytuj zasoby/układ/toolbar.xml i zastąp jego zawartość następującym kodem 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"/>
Pamiętaj, że ?attr
wartości nie są już poprzedzone prefiksem android:
(przypomnij sobie, że ?
notacja odwołuje się do zasobu w bieżącym motywie). Jeśli ?android:attr
nadal były używane w tym miejscu, system Android odwołuje się do wartości atrybutu z aktualnie uruchomionej platformy, a nie z biblioteki AppCompat. Ponieważ w tym przykładzie użyto zdefiniowanej actionBarSize
przez bibliotekę AppCompat, android:
prefiks zostanie porzucony. Podobnie element jest zmieniany na @style
tak, @android:style
aby android:theme
atrybut został ustawiony na motyw w bibliotece AppCompat — ThemeOverlay.AppCompat.Dark.ActionBar
motyw jest używany w tym miejscu, a nie ThemeOverlay.Material.Dark.ActionBar
.
Aktualizowanie stylu
Edytuj zasoby/wartości/styles.xml i zastąp jego zawartość następującym kodem 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>
Nazwy elementów i motyw nadrzędny w tym przykładzie nie są już poprzedzone prefiksem android:
, ponieważ używamy biblioteki AppCompat.
Ponadto motyw nadrzędny jest zmieniany na appCompat w wersji Light.DarkActionBar
.
Aktualizuj menu
Aby obsługiwać wcześniejsze wersje systemu Android, biblioteka AppCompat używa atrybutów niestandardowych dublujących atrybuty android:
przestrzeni nazw. Jednak niektóre atrybuty (takie jak showAsAction
atrybut używany w tagu <menu>
) nie istnieją w strukturze systemu Android na starszych urządzeniach — showAsAction
zostały wprowadzone w interfejsie API systemu Android 11, ale nie są dostępne w interfejsie API systemu Android 7. Z tego powodu niestandardowa przestrzeń nazw musi służyć do prefiksu wszystkich atrybutów zdefiniowanych przez bibliotekę obsługi. W plikach zasobów menu przestrzeń nazw o nazwie local
jest definiowana na potrzeby prefiksowania atrybutu showAsAction
.
Edytuj zasoby/menu/top_menus.xml i zastąp jego zawartość następującym kodem 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
Przestrzeń nazw jest dodawana przy użyciu tego wiersza:
xmlns:local="http://schemas.android.com/apk/res-auto">
Atrybut showAsAction
jest poprzedzony tą local:
przestrzenią nazw, a nie android:
local:showAsAction="ifRoom"
Podobnie edytuj zasoby/menu/edit_menus.xml i zastąp jego zawartość następującym kodem 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>
Jak ten przełącznik przestrzeni nazw zapewnia obsługę atrybutu showAsAction
w wersjach systemu Android przed poziomem 11 interfejsu API? Atrybut showAsAction
niestandardowy i wszystkie możliwe wartości są uwzględniane w aplikacji po zainstalowaniu pakietu NuGet AppCompat.
Podklasa AppCompatActivity
Ostatnim krokiem konwersji jest zmodyfikowanie MainActivity
tak, aby była to podklasa .AppCompatActivity
Edytuj MainActivity.cs i dodaj następujące using
instrukcje:
using Android.Support.V7.App;
using Toolbar = Android.Support.V7.Widget.Toolbar;
Oznacza Toolbar
to, że jest to wersja AppCompat programu Toolbar
. Następnie zmień definicję klasy :MainActivity
public class MainActivity : AppCompatActivity
Aby ustawić pasek akcji na wersję AppCompat elementu Toolbar
, zastąp wywołanie parametrem SetActionBar
SetSupportActionBar
. W tym przykładzie tytuł jest również zmieniany, aby wskazać, że używana jest wersja Toolbar
AppCompat:
SetSupportActionBar (toolbar);
SupportActionBar.Title = "My AppCompat Toolbar";
Na koniec zmień poziom minimum systemu Android na wartość pre-Lollipop, która ma być obsługiwana (na przykład INTERFEJS API 19).
Skompiluj aplikację i uruchom ją na urządzeniu przed lollipop lub emulatorze systemu Android. Poniższy zrzut ekranu przedstawia wersję AppCompat narzędzia ToolbarFun na urządzeniu Nexus 4 z uruchomionym zestawem KitKat (interfejs API 19):
Gdy używana jest biblioteka AppCompat, motywy nie muszą być przełączane na podstawie wersji systemu Android — biblioteka AppCompat umożliwia zapewnienie spójnego środowiska użytkownika we wszystkich obsługiwanych wersjach systemu Android.