Cómo mejorar tu widget

Prueba hacerlo con Compose
Jetpack Compose es el kit de herramientas de IU recomendado para Android. Aprende a compilar widgets con las APIs de estilo Compose.

En esta página, se incluyen detalles sobre las mejoras opcionales de widgets que están disponibles a partir de Android 12 (nivel de API 31). Estas funciones son opcionales, pero son fáciles de implementar y mejoran la experiencia de los usuarios con los widgets.

Cómo usar colores dinámicos

A partir de Android 12, un widget puede usar los colores del tema del dispositivo para botones, fondos y otros componentes. De esta manera, se permiten transiciones más fluidas y coherencia en distintos widgets.

Hay dos maneras de lograr colores dinámicos:

  • Usa el tema predeterminado del sistema (@android:style/Theme.DeviceDefault.DayNight) en el diseño raíz.

  • Usa el tema Material 3 (Theme.Material3.DynamicColors.DayNight) de la biblioteca de componentes de Material para Android, disponible a partir de la versión 1.6.0 de Componentes de Material para Android.

Una vez que se establece el tema en el diseño raíz, puedes usar atributos de color comunes en la raíz o en cualquiera de sus elementos secundarios para obtener los colores dinámicos.

Estos son algunos ejemplos de atributos de color que puedes usar:

  • ?attr/primary
  • ?attr/primaryContainer
  • ?attr/onPrimary
  • ?attr/onPrimaryContainer

En el siguiente ejemplo en el que se usa el tema Material 3, el color de tema del dispositivo es "morado". El color de los elementos destacados y el fondo del widget se adaptan a los modos claro y oscuro, como se muestra en las figuras 1 y 2.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="?attr/colorPrimaryContainer"
  android:theme="@style/Theme.Material3.DynamicColors.DayNight">

  <ImageView
    ...
    app:tint="?attr/colorPrimaryContainer"
    android:src="@drawable/ic_partly_cloudy" />

    <!-- Other widget content. -->

</LinearLayout>
Widget en el tema del modo claro
Figura 1. Widget en tema claro
Widgets en el tema del modo oscuro
Figura 2: Widget en tema oscuro

Retrocompatibilidad con colores dinámicos

Los colores dinámicos solo están disponibles en dispositivos que ejecutan Android 12 o versiones posteriores. Para proporcionar un tema personalizado para versiones anteriores, crea un tema predeterminado con tus colores personalizados y un nuevo calificador (values-v31) con los atributos de tema predeterminados.

El siguiente es un ejemplo en el que se usa el tema Material 3:

/values/styles.xml

<resources>
  <style name="MyWidgetTheme" parent="Theme.Material3.DynamicColors.DayNight">
    <!-- Override default colorBackground attribute with custom color. -->
    <item name="android:colorBackground">@color/my_background_color</item>

    <!-- Add other colors/attributes. -->

  </style>
</resources>

/values-v31/styles.xml

<resources>
  <!-- Do not override any color attribute. -->
  <style name="MyWidgetTheme" parent="Theme.Material3.DynamicColors.DayNight" />
</resources>

/layout/my_widget_layout.xml

<resources>
  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    ...
    android:background="?android:attr/colorBackground"
    android:theme="@style/MyWidgetTheme" />
</resources>

Cómo habilitar la compatibilidad con la voz

Acciones en apps permite que el Asistente de Google muestre widgets en respuesta a comandos de voz relevantes del usuario. Si configuras tu widget para que responda a intents integrados (BIIs), tu app puede mostrar widgets de forma proactiva en las plataformas del Asistente, como Android y Android Auto. Los usuarios tienen la opción de fijar los widgets que muestra el Asistente en su selector, lo que fomenta la participación futura.

Por ejemplo, puedes configurar el widget de resumen de entrenamiento para que tu app de ejercicios cumpla con los comandos de voz del usuario que activan el GET_EXERCISE_OBSERVATION BII. El Asistente muestra tu widget de forma proactiva cuando los usuarios activan este BII con solicitudes como "Hey Google, ¿cuántas millas corrí esta semana en AppDeEjemplo?"

Hay docenas de BIIs que abarcan varias categorías de interacción del usuario, lo que permite que casi cualquier app para Android mejore sus widgets para la voz. Para comenzar, consulta Cómo integrar Acciones en apps con widgets de Android.

Cómo agregar un nombre al widget

Los widgets deben tener un nombre único cuando se muestran en el selector de widgets.

Los nombres de los widgets se cargan desde el atributo label del elemento receiver del widget en el archivo AndroidManifest.xml.

<receiver
    ….
   android:label="Memories">
     ….
</receiver>

Cómo agregar una descripción para el widget

A partir de Android 12, proporciona una descripción para que el selector del widget se muestre con este.

Una imagen que muestra un selector de widgets con un widget y su descripción
Figura 3. Selector de widgets de ejemplo que muestra un widget y su descripción

Brinda una descripción para el widget con el description atributo del &lt;appwidget-provider&gt; elemento:

<appwidget-provider
    android:description="@string/my_widget_description">
</appwidget-provider>

Puedes usar el descriptionRes atributo en versiones anteriores de Android, pero el selector de widgets lo ignora.

Cómo habilitar transiciones más fluidas

A partir de Android 12, los selectores brindan una transición más fluida cuando un usuario inicia la app desde un widget.

A fin de habilitar la mejora de esta transición, usa @android:id/background o android.R.id.background para identificar el elemento en segundo plano:

// Top-level layout of the widget.
<LinearLayout
    android:id="@android:id/background">
</LinearLayout>

Tu app puede usar @android:id/background en versiones anteriores de Android sin interrupciones, pero se ignora.

Cómo utilizar la modificación del tiempo de ejecución de RemoteViews

A partir de Android 12, puedes aprovechar varios métodos RemoteViews que permiten la modificación del tiempo de ejecución de los atributos RemoteViews. Consulta la RemoteViews referencia de la API para ver la lista completa de métodos agregados.

En el siguiente ejemplo de código, se muestra cómo usar algunos de estos métodos.

Kotlin

// Set the colors of a progress bar at runtime.
remoteView.setColorStateList(R.id.progress, "setProgressTintList", createProgressColorStateList())

// Specify exact sizes for margins.
remoteView.setViewLayoutMargin(R.id.text, RemoteViews.MARGIN_END, 8f, TypedValue.COMPLEX_UNIT_DP)

Java

// Set the colors of a progress bar at runtime.
remoteView.setColorStateList(R.id.progress, "setProgressTintList", createProgressColorStateList());

// Specify exact sizes for margins.
remoteView.setViewLayoutMargin(R.id.text, RemoteViews.MARGIN_END, 8f, TypedValue.COMPLEX_UNIT_DP);