Freigeben über


Kompatibilität von Symbolleisten

Übersicht

In diesem Abschnitt wird erläutert, wie Sie in früheren Versionen von Android als Android 5.0 Lollipop verwenden Toolbar . Wenn Ihre App versionen von Android vor Android 5.0 nicht unterstützt, können Sie diesen Abschnitt überspringen.

Da Toolbar sie Teil der Android v7-Supportbibliothek ist, kann sie auf Geräten mit Android 2.1 (API-Ebene 7) und höher verwendet werden. Die Android-Supportbibliothek v7 AppCompat NuGet muss jedoch installiert und der code geändert werden, damit die Toolbar in dieser Bibliothek bereitgestellte Implementierung verwendet wird. In diesem Abschnitt wird erläutert, wie Sie dieses NuGet installieren und die ToolbarFun-App von "Hinzufügen einer zweiten Symbolleiste " ändern, sodass sie in früheren Versionen von Android als Lollipop 5.0 ausgeführt wird.

So ändern Sie eine App, um die AppCompat-Version der Symbolleiste zu verwenden:

  1. Legen Sie die Android-Mindest- und Zielversionen für die App fest.

  2. Installieren Sie das AppCompat NuGet-Paket.

  3. Verwenden Sie ein AppCompat-Design anstelle eines integrierten Android-Designs.

  4. Ändern Sie MainActivity sie so, dass sie Unterklassen AppCompatActivity anstelle von Activity.

Jeder dieser Schritte wird in den folgenden Abschnitten ausführlich erläutert.

Festlegen der Mindest- und Ziel-Android-Version

Das Zielframework der App muss auf API-Ebene 21 oder höher festgelegt werden, oder die App wird nicht ordnungsgemäß bereitgestellt. Wenn beim Bereitstellen der App ein Fehler wie "Kein Ressourcenbezeichner" für das Attribut "tileModeX" im Paket "android" gefunden wird, liegt dies daran, dass das Zielframework nicht auf Android 5.0 (API Level 21 - Lollipop) oder höher festgelegt ist.

Legen Sie die Zielframework-Ebene auf API-Ebene 21 oder höher fest, und legen Sie die Projekteinstellungen auf Android-API-Ebene auf die mindeste Android-Version fest, die von der App unterstützt werden soll. Weitere Informationen zum Festlegen von Android-API-Ebenen finden Sie unter Grundlegendes zu Android-API-Ebenen. ToolbarFun Im Beispiel wird die Minimale Android-Version auf KitKat (API Level 4.4) festgelegt.

Installieren des AppCompat NuGet-Pakets

Fügen Sie als Nächstes das Android-Supportbibliothek v7 AppCompat-Paket zum Projekt hinzu. Klicken Sie in Visual Studio mit der rechten Maustaste auf Verweise, und wählen Sie "NuGet-Pakete verwalten" aus. Klicken Sie auf "Durchsuchen" und suchen Sie nach Der Android-Supportbibliothek v7 AppCompat. Wählen Sie Xamarin.Android.Support.v7.AppCompat aus, und klicken Sie auf "Installieren":

Screenshot des V7 Appcompat-Pakets, das in

Wenn dieses NuGet installiert ist, werden auch mehrere andere NuGet-Pakete installiert, wenn sie noch nicht vorhanden sind (z . B. Xamarin.Android.Support.Animated.Vector.Drawable, Xamarin.Android.Support.v4 und Xamarin.Android.Support.Vector.Drawable). Weitere Informationen zum Installieren von NuGet-Paketen finden Sie unter Walkthrough: Including a NuGet in your project.

Verwenden eines AppCompat-Designs und einer Symbolleiste

Die AppCompat-Bibliothek enthält mehrere Theme.AppCompat Designs, die auf jeder version von Android verwendet werden können, die von der AppCompat-Bibliothek unterstützt wird. Das Beispiel-App-Design ToolbarFun wird abgeleitet von Theme.Material.Light.DarkActionBar, das in Android-Versionen vor Lollipop nicht verfügbar ist. ToolbarFun Daher muss an die Verwendung des AppCompat-Gegenstücks für dieses Design angepasst werden. Theme.AppCompat.Light.DarkActionBar Da Toolbar es nicht für Versionen von Android vor Lollipop verfügbar ist, müssen wir die AppCompat-Version von Toolbar. Daher müssen android.support.v7.widget.Toolbar Layouts anstelle von Toolbar.

Layouts aktualisieren

Bearbeiten Sie Ressourcen/layout/Main.axml, und ersetzen Sie das Toolbar Element durch den folgenden XML-Code:

<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" />

Bearbeiten Sie Ressourcen/Layout/toolbar.xml , und ersetzen Sie deren Inhalt durch den folgenden XML-Code:

<?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"/>

Beachten Sie, dass den ?attr Werten kein Präfix mehr vorangestellt android: ist (erinnern Sie sich daran, dass die ? Notation auf eine Ressource im aktuellen Design verweist). Wenn ?android:attr sie hier noch verwendet würden, würde Android auf den Attributwert der derzeit ausgeführten Plattform und nicht auf die AppCompat-Bibliothek verweisen. Da in diesem Beispiel die actionBarSize durch die AppCompat-Bibliothek definierte Eigenschaft verwendet wird, wird das android: Präfix gelöscht. Auf ähnliche Weise wird das Attribut so geändert, @android:style dass das android:theme Attribut auf ein Design in der AppCompat-Bibliothek festgelegt wird – das ThemeOverlay.AppCompat.Dark.ActionBar Design wird hier anstelle von ThemeOverlay.Material.Dark.ActionBar.@style

Aktualisieren der Formatvorlage

Bearbeiten Sie Ressourcen/Werte/styles.xml , und ersetzen Sie deren Inhalt durch den folgenden XML-Code:

<?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>

Die Elementnamen und das übergeordnete Design in diesem Beispiel sind nicht mehr präfixiert android: , da wir die AppCompat-Bibliothek verwenden. Außerdem wird das übergeordnete Design in die AppCompat-Version von Light.DarkActionBargeändert.

Menüs aktualisieren

Zur Unterstützung früherer Versionen von Android verwendet die AppCompat-Bibliothek benutzerdefinierte Attribute, die die Attribute des android: Namespaces Spiegel. Einige Attribute (z. B. das attribut, das showAsAction im <menu> Tag verwendet wird) sind jedoch nicht im Android-Framework auf älteren Geräten vorhanden – showAsAction wurde in der Android-API 11 eingeführt, ist aber in Android API 7 nicht verfügbar. Aus diesem Grund muss ein benutzerdefinierter Namespace verwendet werden, um allen attributen, die von der Supportbibliothek definiert sind, voranzustellen. In den Menüressourcendateien wird ein aufgerufener local Namespace für das Präfix des showAsAction Attributs definiert.

Bearbeiten Sie Ressourcen/Menü/top_menus.xml , und ersetzen Sie deren Inhalt durch den folgenden XML-Code:

<?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>

Der local Namespace wird mit dieser Zeile hinzugefügt:

xmlns:local="http://schemas.android.com/apk/res-auto">

Das showAsAction Attribut wird mit diesem Namespace statt mit diesem local: Namespace vorgestellt. android:

local:showAsAction="ifRoom"

Bearbeiten Sie auch Ressourcen/Menü/edit_menus.xml , und ersetzen Sie deren Inhalt durch den folgenden XML-Code:

<?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>

Wie bietet dieser Namespace-Switch Unterstützung für das showAsAction Attribut in Android-Versionen vor API-Ebene 11? Das benutzerdefinierte Attribut showAsAction und alle möglichen Werte sind in der App enthalten, wenn das AppCompat NuGet installiert wird.

Unterklasse AppCompatActivity

Der letzte Schritt in der Konvertierung besteht darin, sie so zu ändern MainActivity , dass es sich um eine Unterklasse von AppCompatActivity. Bearbeiten Sie MainActivity.cs , und fügen Sie die folgenden using Anweisungen hinzu:

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

Dies Toolbar deklariert die AppCompat-Version von Toolbar. Ändern Sie als Nächstes die Klassendefinition von MainActivity:

public class MainActivity : AppCompatActivity

Um die Aktionsleiste auf die AppCompat-Version von Toolbarfestzulegen, ersetzen Sie den Aufruf durch SetActionBar SetSupportActionBar. In diesem Beispiel wird der Titel ebenfalls geändert, um anzugeben, dass die AppCompat-Version Toolbar verwendet wird:

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

Ändern Sie schließlich die Mindest-Android-Ebene in den Pre-Lollipop-Wert, der unterstützt werden soll (z. B. API 19).

Erstellen Sie die App, und führen Sie sie auf einem Vorab-Lollipop-Gerät oder Android-Emulator aus. Der folgende Screenshot zeigt die AppCompat-Version von ToolbarFun auf einem Nexus 4 mit KitKat (API 19):

Vollständiger Screenshot der App, die auf einem KitKat-Gerät ausgeführt wird, werden beide Symbolleisten angezeigt.

Wenn die AppCompat-Bibliothek verwendet wird, müssen Designs nicht basierend auf der Android-Version gewechselt werden – die AppCompat-Bibliothek ermöglicht es, eine konsistente Benutzererfahrung für alle unterstützten Android-Versionen bereitzustellen.