Compatibilidad de barra de herramientas
Información general
En esta sección se explica cómo usar Toolbar
en versiones de Android anteriores a Android 5.0 Lollipop. Si su aplicación no admite versiones de Android anteriores a Android 5.0, puedes omitir esta sección.
Dado que Toolbar
forma parte de la biblioteca de compatibilidad de Android v7, se puede usar en dispositivos que ejecutan Android 2.1 (nivel de API 7) y versiones posteriores. Sin embargo, la biblioteca de soporte técnico de Android v7 AppCompat NuGet debe instalarse y el código modificado para que use la implementación Toolbar
proporcionada en esta biblioteca. En esta sección se explica cómo instalar este NuGet y modificar la aplicación ToolbarFun desde Agregar una segunda barra de herramientas para que se ejecute en versiones de Android anteriores a Lollipop 5.0.
Modificar una aplicación para usar la versión AppCompat de Toolbar:
Establezca las versiones de Android mínima y de destino para la aplicación.
Instale el paquete NuGet AppCompat.
Use un tema AppCompat en lugar de un tema integrado de Android.
Modifique
MainActivity
para que tenga las subclasesAppCompatActivity
en lugar deActivity
.
En las siguientes secciones se explican en detalle cada uno de estos pasos.
Establecer la versión mínima y de destino de Android
La plataforma de destino de la aplicación debe establecerse en nivel de API 21 o posterior o la aplicación no se implementará correctamente. Si se ve un error como No se encontró ningún identificador de recurso para el atributo 'tileModeX' en el paquete 'android' al implementar la aplicación, se debe a que la plataforma de destino no está establecida en Android 5.0 (nivel de API 21 - Lollipop) o superior.
Establezca el nivel de plataforma de destino en nivel de API 21 o superior y establezca la configuración del proyecto de nivel de API de Android en la versión mínima de Android que la aplicación va a admitir. Para obtener más información sobre los niveles de API de Android, vea Información de los niveles de API de Android.
En el ejemplo ToolbarFun
, la versión mínima de Android se establece en KitKat (nivel de API 4.4).
Instalación del paquete NuGet AppCompat
A continuación, agregue el paquete AppCompat de la biblioteca de soporte técnico de Android v7 al proyecto. En Visual Studio, haga clic con el botón derecho en Referencias y seleccione Administrar paquetes NuGet.... Haga clic en Examinar y busque Android Support Library v7 AppCompat . Seleccione Xamarin.Android.Support.v7.AppCompat y haga clic en Instalar:
Cuando se instala este NuGet, también se instalan otros paquetes NuGet si aún no están presentes (como Xamarin.Android.Support.Animated.Vector.Drawable, Xamarin.Android.Support.v4 y Xamarin.Android.Support.Vector.Drawable). Para obtener más información sobre cómo instalar paquetes NuGet, vea Tutorial: incluir un NuGet en el proyecto.
Usar un tema y una barra de herramientas de AppCompat
La biblioteca AppCompat incluye varios temas Theme.AppCompat
que se pueden usar en cualquier versión de Android compatible con la biblioteca AppCompat. El tema de la aplicación de ejemplo ToolbarFun
se deriva de Theme.Material.Light.DarkActionBar
, que no está disponible en versiones de Android anteriores a Lollipop. Por lo tanto, ToolbarFun
debe adaptarse para usar el homólogo de AppCompat para este tema, Theme.AppCompat.Light.DarkActionBar
. Además, dado que Toolbar
no está disponible en versiones de Android anteriores a Lollipop, debemos usar la versión AppCompat de Toolbar
. Por lo tanto, los diseños deben usar android.support.v7.widget.Toolbar
en lugar de Toolbar
.
Actualizar diseños
Edite Resources/layout/Main.axml y reemplace el elemento Toolbar
por el siguiente XML:
<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" />
Edite Resources/layout/toolbar.xml y reemplace su contenido por el siguiente XML:
<?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"/>
Tenga en cuenta que los valores ?attr
ya no tienen el prefijo android:
(recuerde que la notación ?
hace referencia a un recurso en el tema actual). Si ?android:attr
todavía se usaran aquí, Android haría referencia al valor de atributo de la plataforma actualmente en ejecución en lugar de desde la biblioteca AppCompat. Dado que en este ejemplo se usa el actionBarSize
definido por la biblioteca AppCompat, se quita el prefijo android:
. Del mismo modo, @android:style
se cambia a @style
para que el atributo android:theme
se establezca en un tema de la biblioteca AppCompat: aquí se usa el tema ThemeOverlay.AppCompat.Dark.ActionBar
en lugar de ThemeOverlay.Material.Dark.ActionBar
.
Actualizar el estilo
Edite Resources/values/styles.xml y reemplace su contenido por el siguiente XML:
<?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>
Los nombres de elemento y el tema primario de este ejemplo ya no tienen el prefijo android:
porque se usa la biblioteca AppCompat.
Además, el tema primario se cambia a la versión AppCompat de Light.DarkActionBar
.
Menús de actualización
Para admitir versiones anteriores de Android, la biblioteca AppCompat usa atributos personalizados que reflejan los atributos del espacio de nombres android:
. Sin embargo, algunos atributos (como el atributo showAsAction
usado en la etiqueta <menu>
) no existen en el marco de Android en dispositivos anteriores: showAsAction
se introdujo en la API 11 de Android, pero no está disponible en la API 7 de Android. Por este motivo, se debe usar un espacio de nombres personalizado para prefijar todos los atributos definidos por la biblioteca de soporte técnico. En los archivos de recursos de menú, se define un espacio de nombres denominado local
para prefijar el atributo showAsAction
.
Edite Resources/menu/top_menus.xml y reemplace su contenido por el siguiente XML:
<?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>
El espacio de nombres local
se agrega con esta línea:
xmlns:local="http://schemas.android.com/apk/res-auto">
El atributo showAsAction
está precedido de este espacio de nombres local:
en lugar de android:
local:showAsAction="ifRoom"
Del mismo modo, edite Resources/menu/edit_menus.xml y reemplace su contenido por el siguiente XML:
<?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>
¿Cómo proporciona este modificador de espacio de nombres compatibilidad con el atributo showAsAction
en versiones de Android anteriores al nivel de API 11? El atributo personalizado showAsAction
y todos sus valores posibles se incluyen en la aplicación cuando se instala AppCompat NuGet.
Subclase AppCompatActivity
El último paso de la conversión es modificar MainActivity
para que sea una subclase de AppCompatActivity
. Edite MainActivity.cs y agregue las siguientes using
instrucciones:
using Android.Support.V7.App;
using Toolbar = Android.Support.V7.Widget.Toolbar;
Esto declara que Toolbar
es la versión de AppCompat de Toolbar
. A continuación, cambie la definición de clase de MainActivity
:
public class MainActivity : AppCompatActivity
Para establecer la barra de acciones en la versión de AppCompat de Toolbar
, sustituya la llamada a SetActionBar
por SetSupportActionBar
. En este ejemplo, el título también se cambia para indicar que se usa la versión de AppCompat de Toolbar
:
SetSupportActionBar (toolbar);
SupportActionBar.Title = "My AppCompat Toolbar";
Por último, cambie el nivel mínimo de Android al valor anterior a Lollipop que se va a admitir (por ejemplo, API 19).
Compile la aplicación y ejecútela en un dispositivo pre-Lollipop o emulador de Android. En la captura de pantalla siguiente se muestra la versión AppCompat de ToolbarFun en un Nexus 4 que ejecuta KitKat (API 19):
Cuando se usa la biblioteca AppCompat, los temas no tienen que cambiarse en función de la versión de Android: la biblioteca AppCompat permite proporcionar una experiencia de usuario coherente en todas las versiones de Android compatibles.