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:
Legen Sie die Android-Mindest- und Zielversionen für die App fest.
Installieren Sie das AppCompat NuGet-Paket.
Verwenden Sie ein AppCompat-Design anstelle eines integrierten Android-Designs.
Ändern Sie
MainActivity
sie so, dass sie UnterklassenAppCompatActivity
anstelle vonActivity
.
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":
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.DarkActionBar
geä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 Toolbar
festzulegen, 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):
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.