Condividi tramite


Compatibilità di Toolbar

Panoramica

Questa sezione illustra come usare Toolbar nelle versioni di Android precedenti a Android 5.0 Lollipop. Se l'app non supporta versioni di Android precedenti a Android 5.0, è possibile ignorare questa sezione.

Poiché Toolbar fa parte della libreria di supporto android v7, può essere usata nei dispositivi che eseguono Android 2.1 (livello API 7) e versioni successive. Tuttavia, la libreria di supporto Android v7 AppCompat NuGet deve essere installata e il codice modificato in modo che usi l'implementazione Toolbar fornita in questa libreria. Questa sezione illustra come installare questo NuGet e modificare l'app ToolbarFun da Aggiunta di una seconda barra degli strumenti in modo che venga eseguita nelle versioni di Android precedenti a Lollipop 5.0.

Per modificare un'app per usare la versione AppCompat della barra degli strumenti:

  1. Impostare le versioni Minima e Android di destinazione per l'app.

  2. Installare il pacchetto NuGet AppCompat.

  3. Usa un tema AppCompat anziché un tema Android predefinito.

  4. Modificare MainActivity in modo che sottoclassi AppCompatActivity anziché Activity.

Ognuno di questi passaggi è illustrato in dettaglio nelle sezioni seguenti.

Impostare la versione minima e quella di destinazione per Android

Il framework di destinazione dell'app deve essere impostato sul livello API 21 o versione successiva oppure l'app non verrà distribuita correttamente. Se durante la distribuzione dell'app viene visualizzato un errore, ad esempio Nessun identificatore di risorsa per l'attributo 'tileModeX' nel pacchetto 'android', questo perché Target Framework non è impostato su Android 5.0 (livello API 21 - Lollipop) o versione successiva.

Impostare il livello Framework di destinazione su Livello API 21 o versione successiva e impostare le impostazioni del progetto a livello di API Android sulla versione minima di Android che l'app deve supportare. Per altre informazioni sull'impostazione dei livelli api Android, vedere Informazioni sui livelli api Android. Nell'esempio ToolbarFun la versione minima di Android è impostata su KitKat (livello API 4.4).

Installare il pacchetto NuGet AppCompat

Aggiungere quindi il pacchetto AppCompat della libreria di supporto Android v7 al progetto. In Visual Studio fare clic con il pulsante destro del mouse su Riferimenti e scegliere Gestisci pacchetti NuGet. Fare clic su Sfoglia e cercare Android Support Library v7 AppCompat.Click Browse and search for Android Support Library v7 AppCompat. Selezionare Xamarin.Android.Support.v7.AppCompat e fare clic su Installa:

Screenshot del pacchetto Appcompat V7 selezionato in Gestisci pacchetti NuGet

Quando viene installato questo NuGet, vengono installati anche diversi altri pacchetti NuGet, se non già presenti, ad esempio Xamarin.Android.Support.Animated.Vector.Drawable, Xamarin.Android.Support.v4 e Xamarin.Android.Support.Vector.Drawable. Per altre informazioni sull'installazione di pacchetti NuGet, vedere Procedura dettagliata: Inclusione di un nuGet nel progetto.

Usare un tema e una barra degli strumenti AppCompat

La libreria AppCompat include diversi Theme.AppCompat temi che possono essere usati in qualsiasi versione di Android supportata dalla libreria AppCompat. Il tema dell'app ToolbarFun di esempio è derivato da Theme.Material.Light.DarkActionBar, che non è disponibile nelle versioni di Android precedenti a Lollipop. Pertanto, ToolbarFun deve essere adattato per usare la controparte AppCompat per questo tema, Theme.AppCompat.Light.DarkActionBar. Inoltre, poiché Toolbar non è disponibile nelle versioni di Android precedenti a Lollipop, è necessario usare la versione AppCompat di Toolbar. Pertanto, i layout devono usare android.support.v7.widget.Toolbar invece di Toolbar.

Aggiornare i layout

Modificare Resources/layout/Main.axml e sostituire l'elemento Toolbar con il codice XML seguente:

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

Modifica risorse/layout/toolbar.xml e sostituisci il relativo contenuto con il codice XML seguente:

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

Si noti che i ?attr valori non sono più preceduti android: da (tenere presente che la ? notazione fa riferimento a una risorsa nel tema corrente). Se ?android:attr fosse ancora usato qui, Android fa riferimento al valore dell'attributo dalla piattaforma attualmente in esecuzione anziché dalla libreria AppCompat. Poiché questo esempio usa l'oggetto actionBarSize definito dalla libreria AppCompat, il android: prefisso viene eliminato. Analogamente, @android:style viene modificato in @style in modo che l'attributo android:theme sia impostato su un tema nella libreria AppCompat. Il ThemeOverlay.AppCompat.Dark.ActionBar tema viene usato qui anziché ThemeOverlay.Material.Dark.ActionBar.

Aggiornare lo stile

Modificare Risorse/valori/styles.xml e sostituirne il contenuto con il codice XML seguente:

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

I nomi degli elementi e il tema padre in questo esempio non sono più preceduti android: da perché viene usata la libreria AppCompat. Inoltre, il tema padre viene modificato nella versione AppCompat di Light.DarkActionBar.

Aggiorna menu

Per supportare le versioni precedenti di Android, la libreria AppCompat usa attributi personalizzati che rispecchiano gli attributi dello spazio dei android: nomi. Tuttavia, alcuni attributi (ad esempio l'attributo showAsAction usato nel <menu> tag) non esistono nel framework Android nei dispositivi meno recenti. showAsAction È stato introdotto nell'API Android 11 ma non è disponibile nell'API Android 7. Per questo motivo, è necessario usare uno spazio dei nomi personalizzato per anteporre tutti gli attributi definiti dalla libreria di supporto. Nei file di risorse del menu viene definito uno spazio dei nomi denominato local per il prefisso dell'attributo showAsAction .

Modifica risorse/menu/top_menus.xml e sostituisci il relativo contenuto con il codice XML seguente:

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

Lo local spazio dei nomi viene aggiunto con questa riga:

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

L'attributo showAsAction è preceduto da questo local: spazio dei nomi anziché da android:

local:showAsAction="ifRoom"

Analogamente, modificare Risorse/menu/edit_menus.xml e sostituirne il contenuto con il codice XML seguente:

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

In che modo questa opzione dello spazio dei nomi fornisce il supporto per l'attributo showAsAction nelle versioni android precedenti al livello API 11? L'attributo showAsAction personalizzato e tutti i relativi valori possibili vengono inclusi nell'app quando viene installato AppCompat NuGet.

Sottoclasse AppCompatActivity

Il passaggio finale della conversione consiste nel modificare MainActivity in modo che sia una sottoclasse di AppCompatActivity. Modificare MainActivity.cs e aggiungere le istruzioni seguenti using :

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

Toolbar Dichiara di essere la versione AppCompat di Toolbar. Modificare quindi la definizione della classe di MainActivity:

public class MainActivity : AppCompatActivity

Per impostare la barra delle azioni sulla versione AppCompat di Toolbar, sostituire la chiamata a SetActionBar con SetSupportActionBar. In questo esempio, il titolo viene modificato anche per indicare che viene usata la versione AppCompat di Toolbar :

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

Modificare infine il livello Minimo di Android impostando il valore pre-Lollipop che deve essere supportato (ad esempio, API 19).

Compilare l'app ed eseguirla in un dispositivo pre-Lollipop o in un emulatore Android. Lo screenshot seguente mostra la versione AppCompat di ToolbarFun in un Nexus 4 che esegue KitKat (API 19):

Screenshot completo dell'app in esecuzione in un dispositivo KitKat, vengono visualizzate entrambe le barre degli strumenti

Quando si usa la libreria AppCompat, i temi non devono essere spostati in base alla versione di Android. La libreria AppCompat consente di offrire un'esperienza utente coerente in tutte le versioni di Android supportate.