Compartir vía


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:

  1. Establezca las versiones de Android mínima y de destino para la aplicación.

  2. Instale el paquete NuGet AppCompat.

  3. Use un tema AppCompat en lugar de un tema integrado de Android.

  4. Modifique MainActivity para que tenga las subclases AppCompatActivity en lugar de Activity.

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:

Captura de pantalla del paquete V7 Appcompat seleccionado en Administrar paquetes NuGet

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

Captura de pantalla completa de la aplicación que se ejecuta en un dispositivo KitKat, se muestran ambas barras de herramientas

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.