Udostępnij za pośrednictwem


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:

  1. Ustaw minimalną i docelową wersję systemu Android dla aplikacji.

  2. Zainstaluj pakiet NuGet AppCompat.

  3. Użyj motywu AppCompat zamiast wbudowanego motywu systemu Android.

  4. Zmodyfikuj MainActivity tak, aby podklasy AppCompatActivity , a nie Activity.

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:

Zrzut ekranu przedstawiający wybrany pakiet V7 AppCompat w obszarze Zarządzanie pakietami NuGet

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.DarkActionBarelementu , 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):

Pełny zrzut ekranu przedstawiający aplikację uruchomioną na urządzeniu KitKat. Oba paski narzędzi są wyświetlane

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.