Crea un widget básico

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.

Los widgets son vistas de apps en miniatura que puedes incorporar en otras apps, como la pantalla principal, y recibir actualizaciones periódicas. Estas vistas se denominan widgets en la interfaz de usuario, y puedes publicar una con un proveedor de widgets de apps (o proveedor de widgets). Se denomina host de widgets de la app (o host de widgets) el componente de esta que puede contener otros widgets. En la Figura 1, se muestra un ejemplo de un widget de música:

Ejemplo de widget de música
Figura 1. Ejemplo de un widget de música

En este documento, se describe cómo publicar un widget con un proveedor de widgets. Si deseas obtener más información para crear tu propio AppWidgetHost para alojar widgets de apps, consulta Cómo crear un host de widgets.

Para obtener información sobre cómo diseñar el widget, consulta Descripción general de los widgets de apps.

Componentes del widget

Para crear un widget, necesitas los siguientes componentes básicos:

AppWidgetProviderInfo objeto
Describe los metadatos de un widget, como el diseño, la frecuencia de actualización y la AppWidgetProviderclase. AppWidgetProviderInfo se define en XML, como se describe en este documento.
AppWidgetProvider clase
Define los métodos básicos que te permiten interactuar de manera programática con el widget. De esta manera, recibirás emisiones cuando se actualice, se habilite, se inhabilite o se borre el widget. Declaras en el manifiestoAppWidgetProvider y, luego, lo implementas, como se describe en este documento.
Diseño de la vista
Define el diseño inicial del widget. El diseño se define en XML, como se describe en este documento.

En la Figura 2, se muestra cómo estos componentes se ajustan al flujo general de procesamiento de widgets de apps.

Flujo de procesamiento del widget de la app
Figura 2. Flujo de procesamiento de widgets de apps

Si tu widget necesita la configuración del usuario, implementa la actividad de configuración del widget de la app. Esta actividad permite a los usuarios modificar la configuración del widget, por ejemplo, la zona horaria de un widget de reloj.

También recomendamos las siguientes mejoras: diseños de widgets flexibles, mejoras varias, widgets avanzados, widgets de colección, y compilación de un host de widgets.

Cómo declarar el XML de AppWidgetProviderInfo

La definición de la configuración de metadatos (como los tamaños de celda predeterminados, las restricciones de cambio de tamaño y las frecuencias de actualización) es exactamente idéntica en las vistas tradicionales y los widgets basados en Glance.

Para obtener información sobre cómo definir y configurar tu archivo en formato XML de metadatos, consulta la sección Cómo declarar el XML de AppWidgetProviderInfo en Compose-first en la documentación de Glance.

Cómo usar la clase AppWidgetProvider para controlar las emisiones de widgets

La mecánica del receptor de transmisiones de la plataforma, los filtros de declaración de manifiesto y los bucles de eventos de ciclo de vida se unifican en la plataforma. En el desarrollo de Compose-first, estas emisiones se organizan con el wrapper GlanceAppWidgetReceiver.

Para comprender cómo registrar tu receptor en el manifiesto y cómo implementar anulaciones de ciclo de vida compatibles con Hilt, consulta la secciónCómo usar la clase AppWidgetProvider para controlar las emisiones en Compose-first en la documentación de Glance.

Cómo crear el diseño del widget

Debes definir un diseño inicial para el widget en formato XML y guardarlo en el directorio res/layout/ del proyecto. Consulta las Pautas de diseño para obtener más detalles.

Crear el diseño del widget es sencillo si tienes conocimientos sobre los diseños. Sin embargo, ten en cuenta que los diseños de widgets se basan en RemoteViews, que no admite todos los tipos de widgets de diseño o vista. No puedes usar vistas personalizadas ni subclases de las vistas compatibles con RemoteViews.

RemoteViews también admite ViewStub, que es una invisible de tamaño ceroView que puedes usar para aumentar de manera diferida los recursos de diseño durante el tiempo de ejecución.

Compatibilidad con comportamientos con estado

En Android 12, se agrega compatibilidad para comportamientos con estados mediante los siguientes componentes existentes:

El widget todavía no tiene un estado. La app debe almacenar el estado y registrarse para los eventos de cambio de estado.

Ejemplo de un widget de lista de compras que muestra un comportamiento con estado
Figura 3. Ejemplo de comportamiento con estado

En el siguiente ejemplo de código, se muestra cómo implementar estos componentes.

// Check the view.
remoteView.setCompoundButtonChecked(R.id.my_checkbox, true)

// Check a radio group.
remoteView.setRadioGroupChecked(R.id.my_radio_group, R.id.radio_button_2)

// Listen for check changes. The intent has an extra with the key
// EXTRA_CHECKED that specifies the current checked state of the view.
remoteView.setOnCheckedChangeResponse(
    R.id.my_checkbox,
    RemoteViews.RemoteResponse.fromPendingIntent(onCheckedChangePendingIntent)
)

Proporciona dos diseños: uno orientado a dispositivos que ejecutan Android 12 o versiones posteriores en res/layout-v31 y el otro orientado a versiones anteriores de Android 11 o inferiores en la carpeta res/layout predeterminada.

Cómo implementar esquinas redondeadas

El cálculo del fondo exterior y los radios proporcionales internos es estándar y compartido. En el desarrollo de Compose-first, esto se puede configurar de forma dinámica en Kotlin junto con recursos de temas personalizados.

Para implementar radios de esquinas o configurar estilos dinámicos para dispositivos Android más antiguos, consulta la sección Cómo implementar esquinas redondeadas en Compose-first en la documentación de Glance.