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:
Impostare le versioni Minima e Android di destinazione per l'app.
Installare il pacchetto NuGet AppCompat.
Usa un tema AppCompat anziché un tema Android predefinito.
Modificare
MainActivity
in modo che sottoclassiAppCompatActivity
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:
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):
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.