Compatibilité de la barre d’outils
Vue d’ensemble
Cette section explique comment utiliser Toolbar
sur les versions d’Android antérieures à Android 5.0 Lollipop. Si votre application ne prend pas en charge les versions d’Android antérieures à Android 5.0, vous pouvez ignorer cette section.
Étant donné qu’elle Toolbar
fait partie de la bibliothèque de prise en charge Android v7, elle peut être utilisée sur les appareils exécutant Android 2.1 (niveau d’API 7) et versions ultérieures. Toutefois, la bibliothèque de support Android v7 AppCompat NuGet doit être installée et le code modifié afin qu’il utilise l’implémentation Toolbar
fournie dans cette bibliothèque. Cette section explique comment installer ce NuGet et modifier l’application ToolbarFun à partir de l’ajout d’une deuxième barre d’outils afin qu’elle s’exécute sur des versions d’Android antérieures à Lollipop 5.0.
Pour modifier une application pour utiliser la version AppCompat de la barre d’outils :
Définissez les versions Minimale et Cible d’Android pour l’application.
Installez le package NuGet AppCompat.
Utilisez un thème AppCompat au lieu d’un thème Android intégré.
Modifiez
MainActivity
pour qu’elle sous-classeAppCompatActivity
plutôt queActivity
.
Chacune de ces étapes est expliquée en détail dans les sections suivantes.
Définir la version minimale et cible d’Android
L’infrastructure cible de l’application doit être définie sur API Niveau 21 ou supérieur, ou l’application ne sera pas déployée correctement. Si une erreur telle qu’aucun identificateur de ressource trouvé pour l’attribut « tileModeX » dans le package « android » est visible lors du déploiement de l’application, cela est dû au fait que le Framework cible n’est pas défini sur Android 5.0 (NIVEAU d’API 21 - Lollipop) ou supérieur.
Définissez le niveau Framework cible sur LE niveau API 21 ou supérieur et définissez les paramètres du projet au niveau de l’API Android sur la version minimale d’Android prise en charge par l’application. Pour plus d’informations sur la définition des niveaux d’API Android, consultez Présentation des niveaux d’API Android.
Dans l’exemple ToolbarFun
, la version Minimale d’Android est définie sur KitKat (niveau d’API 4.4).
Installer le package NuGet AppCompat
Ensuite, ajoutez le package AppCompat appCompat de la bibliothèque de support Android v7 au projet. Dans Visual Studio, cliquez avec le bouton droit sur Références et sélectionnez Gérer les packages NuGet.... Cliquez sur Parcourir et recherchez La bibliothèque de support Android v7 AppCompat. Sélectionnez Xamarin.Android.Support.v7.AppCompat , puis cliquez sur Installer :
Lorsque ce NuGet est installé, plusieurs autres packages NuGet sont également installés s’ils ne sont pas déjà présents (tels que Xamarin.Android.Support.Animated.Vector.Drawable, Xamarin.Android.Support.v4 et Xamarin.Android.Support.Vector.Drawable). Pour plus d’informations sur l’installation de packages NuGet, consultez Procédure pas à pas : Inclusion d’un NuGet dans votre projet.
Utiliser un thème et une barre d’outils AppCompat
La bibliothèque AppCompat est fournie avec plusieurs Theme.AppCompat
thèmes qui peuvent être utilisés sur n’importe quelle version d’Android prise en charge par la bibliothèque AppCompat. L’exemple ToolbarFun
de thème d’application est dérivé de Theme.Material.Light.DarkActionBar
, qui n’est pas disponible sur les versions Android antérieures à Lollipop. Par conséquent, ToolbarFun
doit être adapté pour utiliser l’équivalent AppCompat pour ce thème. Theme.AppCompat.Light.DarkActionBar
En outre, étant donné que Toolbar
n’est pas disponible sur les versions d’Android antérieures à Lollipop, nous devons utiliser la version AppCompat de Toolbar
. Par conséquent, les dispositions doivent être utilisées android.support.v7.widget.Toolbar
au lieu de Toolbar
.
Mettre à jour les dispositions
Modifiez resources/layout/Main.axml et remplacez l’élément Toolbar
par le code XML suivant :
<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" />
Modifiez les ressources/disposition/toolbar.xml et remplacez son contenu par le code XML suivant :
<?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"/>
Notez que les ?attr
valeurs ne sont plus précédées android:
(rappelez-vous que la ?
notation fait référence à une ressource dans le thème actuel). Si ?android:attr
elles étaient toujours utilisées ici, Android référencerait la valeur d’attribut de la plateforme en cours d’exécution plutôt que de la bibliothèque AppCompat. Étant donné que cet exemple utilise la actionBarSize
bibliothèque AppCompat définie, le android:
préfixe est supprimé. De même, @android:style
il est modifié pour @style
que l’attribut android:theme
soit défini sur un thème dans la bibliothèque AppCompat : le ThemeOverlay.AppCompat.Dark.ActionBar
thème est utilisé ici plutôt que .ThemeOverlay.Material.Dark.ActionBar
Mettre à jour le style
Modifiez les ressources/valeurs/styles.xml et remplacez son contenu par le code XML suivant :
<?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>
Les noms d’éléments et le thème parent de cet exemple ne sont plus préfixés android:
, car nous utilisons la bibliothèque AppCompat.
En outre, le thème parent est remplacé par la version AppCompat de Light.DarkActionBar
.
Mettre à jour les menus
Pour prendre en charge les versions antérieures d’Android, la bibliothèque AppCompat utilise des attributs personnalisés qui miroir les attributs de l’espace android:
de noms. Toutefois, certains attributs (tels que l’attribut showAsAction
utilisé dans la <menu>
balise) n’existent pas dans l’infrastructure Android sur les appareils plus anciens , showAsAction
qui ont été introduits dans l’API Android 11, mais ne sont pas disponibles dans l’API Android 7. Pour cette raison, un espace de noms personnalisé doit être utilisé pour préfixer tous les attributs définis par la bibliothèque de prise en charge. Dans les fichiers de ressources de menu, un espace de noms appelé local
est défini pour préfixer l’attribut showAsAction
.
Modifiez les ressources/menu/top_menus.xml et remplacez son contenu par le code XML suivant :
<?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>
L’espace local
de noms est ajouté avec cette ligne :
xmlns:local="http://schemas.android.com/apk/res-auto">
L’attribut showAsAction
est précédé avec cet local:
espace de noms plutôt que android:
local:showAsAction="ifRoom"
De même, modifiez les ressources/menu/edit_menus.xml et remplacez son contenu par le code XML suivant :
<?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>
Comment ce commutateur d’espace de noms prend-il en charge l’attribut sur les showAsAction
versions Android antérieures à l’API Level 11 ? L’attribut showAsAction
personnalisé et toutes ses valeurs possibles sont inclus dans l’application quand AppCompat NuGet est installé.
Sous-classe AppCompatActivity
La dernière étape de la conversion consiste à modifier MainActivity
afin qu’elle soit une sous-classe de AppCompatActivity
. Modifiez MainActivity.cs et ajoutez les instructions suivantes using
:
using Android.Support.V7.App;
using Toolbar = Android.Support.V7.Widget.Toolbar;
Cela déclare Toolbar
être la version AppCompat de Toolbar
. Ensuite, modifiez la définition de classe de MainActivity
:
public class MainActivity : AppCompatActivity
Pour définir la barre d’action sur la version AppCompat de Toolbar
, remplacez l’appel par SetActionBar
SetSupportActionBar
. Dans cet exemple, le titre est également modifié pour indiquer que la version AppCompat d’est Toolbar
utilisée :
SetSupportActionBar (toolbar);
SupportActionBar.Title = "My AppCompat Toolbar";
Enfin, remplacez le niveau Android minimal par la valeur pré-Lollipop qui doit être prise en charge (par exemple, API 19).
Générez l’application et exécutez-la sur un appareil pré-Lollipop ou un émulateur Android. La capture d’écran suivante montre la version AppCompat de ToolbarFun sur un Nexus 4 exécutant KitKat (API 19) :
Lorsque la bibliothèque AppCompat est utilisée, les thèmes ne doivent pas être basculés en fonction de la version Android. La bibliothèque AppCompat permet de fournir une expérience utilisateur cohérente dans toutes les versions Android prises en charge.