Partager via


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 :

  1. Définissez les versions Minimale et Cible d’Android pour l’application.

  2. Installez le package NuGet AppCompat.

  3. Utilisez un thème AppCompat au lieu d’un thème Android intégré.

  4. Modifiez MainActivity pour qu’elle sous-classe AppCompatActivity plutôt que Activity.

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 :

Capture d’écran du package Appcompat V7 sélectionné dans Gérer les packages NuGet

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) :

Capture d’écran complète de l’application s’exécutant sur un appareil KitKat, les deux barres d’outils sont affichées

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.