Generalidades

Construyendo ComposeWidget con Jetpack Glance | Autor: Matthew Meehan | Diciembre de 2021

Matthew Meehan
Construyendo ComposeWidget con Jetpack Glance Autor Matthew Meehan
Imagen de Mamela

Recientemente, Android anunció Versión alfa de Jetpack Glance, Marco de construcción de widgets buUna generaciónEstá encima de Jetpack Compose. Con el lanzamiento de Android 12, se han mejorado los widgets de la aplicación para mejorar en gran medida la experiencia del desarrollador y del usuario. Por lo tanto, Glance proporciona una forma conveniente y optimizada de crear widgets con menos código. El marco proporciona un conjunto de componentes básicos que se pueden usar para crear experiencias de usuario hermosas y prácticas. Como introducción al uso de Glance, se diseñará un widget de aplicación simple para rastrear cuántos vasos de agua bebe un usuario en un día.El repositorio de Github se puede encontrar aquí.

Widget de agua

Para comenzar a crear widgets de aplicaciones, debe realizar algunos pasos preliminares. Glance es compatible con la última versión estable de Android Studio, por lo que debe actualizarse en consecuencia. En cuanto al proyecto, se requieren varias dependencias de Gradle.

Dependencias de Vista y composición

Dado que Glance se basa en el marco de redacción, se requieren varias dependencias de redacción y Glance en sí. Además, la redacción debe estar habilitada para el proyecto.

Habilitar redactar

Dado que Glance solo está disponible como instantánea, es una compilación generada regularmente en el repositorio androidx.dev, por lo que debe incluirse en «settings.gradle»:

Incluye repositorio de instantáneas

Antes de escribir cualquier componible, debe declarar el widget en el manifiesto de Android y usar otra información de definición.

Información del widget

Los widgets de un vistazo, al igual que los widgets no componibles, sus atributos requieren una definición xml. En el proyecto, puede crear un nuevo directorio de recursos llamado «xml», que lo contendrá. Se creará un nuevo archivo «water_widget_info.xml» en «xml».

Información del gadget

Esta appwidget-provider Proporcione atributos sobre widgets para Android.

  • Nombre del widget («WaterWidget» en este ejemplo)
  • Su información de tamaño mínimo en DP
  • Cómo ajustan los usuarios el tamaño de los widgets
  • El tamaño predeterminado del widget, que es una nueva característica de Android 12. Se establece automáticamente en 2×2, pero se puede escalar de 2×1 a 4×3.
  • Categoría, que define el tipo de widget; puede ser la pantalla de inicio, el protector de teclas o el cuadro de búsqueda.
Cambiar el tamaño de los widgets en Android 12 Manifestación

Con esta información básica, esta información xml ahora se puede incluir en la lista.

Lista de verificación de Android

Para declarar el widget correctamente, debe escribir el receptor en el manifiesto de Android. Como paso preliminar, se escribirá un código repetitivo para crear las clases de receptor y widget. Primero, se creará un archivo llamado «WaterWidget.kt», que contiene estos dos componentes.

Receptor y widget de agua

Esta WaterWidgetReceiver ampliar GlanceAppWidgetReceiver Actúa como proveedor de widgets. Este widget proporcionado, WaterWidget , Contiene una función componible Content() Contendrá el diseño del widget.

Una vez definidas estas clases, el receptor se puede agregar a la lista.

Receptor de lista para widgets de agua
  • name Se utilizará la clase de receptor creada anteriormente: WaterWidgetReceiver
  • El filtro de intención se declara para recibir actualizaciones del widget.
  • Los metadatos utilizarán los atributos previamente definidos en «water_widget_info.xml»

Diseño inicial y de vista previa

Como último paso de este proceso inicial, es necesario definir los diseños inicial y de vista previa para que el widget pueda funcionar correctamente. Desafortunadamente, estos diseños deben escribirse en xml, porque la redacción aún no se admite aquí. Dado que esta parte del código todavía se basa en RemoteView, se necesita uno de los diseños xml compatibles:

  • Disposición del marco
  • Disposición lineal
  • Disposición relativa
  • Diseño de cuadrícula

ConstraintLayout no se aplica al diseño inicial o de vista previa de los widgets.

El diseño inicial es un elemento heredado que contiene el diseño de los widgets declarados en xml. Actualmente, la documentación de Glance explica que se requiere un diseño inicial, pero se eliminará en el futuro. Por lo tanto, un diseño de marco simple actuará como un marcador de posición hasta que se pueda eliminar con la próxima actualización de Glance.

Disposición inicial

Cuando el usuario selecciona un widget del menú de widgets y lo arrastra a la pantalla de inicio, el diseño de vista previa mostrará una vista previa del widget.

Diseño de vista previa

Esta vista previa está diseñada para imitar cómo se verá el widget cuando esté integrado en Compose. Estos se pueden agregar a los atributos en «water_widget_info.xml»:

Vista previa y diseño inicial de la información agregada a los widgets

Nota: antes de Android 12, la vista previa usa android:previewImage Propiedades y use imágenes en lugar de xml para mostrar la vista previa. Para compatibilidad con versiones anteriores, también se puede utilizar este método.

Con suerte, con la actualización de Glance, ya no necesitará crear ninguno de estos componentes xml, porque es contrario a la intuición crear tanto xml como componer diseños al mismo tiempo.

Una vez hecho todo esto, es hora de escribir algunos componibles para los widgets. El widget en sí es simple, contendrá cuatro componentes principales:

  • El texto del contador que muestra cuántos vasos de agua ha bebido el usuario.
  • Texto que muestra la cantidad de vasos recomendados por día
  • Botón para agregar vasos al mostrador
  • Un botón para poner a cero el contador.

Escribe contenido componible

Se puede crear un archivo separado llamado «WaterWidgetContent.kt», y las funciones componibles residirán en este archivo. Nota: Debido a que se pueden compilar con Glance, los componentes utilizados provendrán del marco de Glance, no de la combinación estándar.Por lo tanto, usarán GlanceModifier En vez de Modifier Para cambiar su comportamiento.

A partir del texto del contador, la función recuperará una cadena formateada y le pasará la cantidad de vasos bebidos como parámetro.

Contador de widgets de agua

Esta cadena de formato es de tipo numérico (en este caso, Int) Para mostrar el progreso del usuario. Tenga en cuenta que estos Composables son proporcionados por Glance, no por la biblioteca habitual de Androidx. El comportamiento de estos componentes de la interfaz de usuario y Glance Modifier es muy similar al de sus componentes de Androidx.

A continuación, el texto objetivo contendrá la lógica para seleccionar la cadena en función de si el usuario ha alcanzado el objetivo.

Objetivo de componente de agua

constante RECOMMENDED_DAILY_GLASSES Se puede definir en «WaterWidget.kt» en el objeto complementario.

Gafas de uso diario recomendadas

Ahora, puede declarar botones para agregar y restablecer contadores. Primero, debe agregar los activos vectoriales de cada imagen al paquete res «dibujable».

Más activos vectoriales
Activos vectoriales grunge

Los activos que usan el «signo más» se agregarán al contador, y los restablecimientos del contador usarán el activo «bote de basura».Estas imágenes pueden estar en un Row Alinéelos horizontalmente.

Diseño de botones de widget

Para escribir el procesamiento de clics, un vistazo ActionCallback Debe crearse para cada uno de los dos botones.

Devolución de llamada de acción

mirada ActionCallbacks Exactamente lo que implicaron; realizan acciones cuando se les notifica.En un nuevo archivo llamado «WaterWidgetActions», puede crear dos clases que se extenderán ActionCallbacks .

Devolución de llamada de acción

Estas funciones aprovechan la función de suspensión de la clase padre onRun(); Cuando se llama a la devolución de llamada, la lógica onRun() Será ejecutado.Estas devoluciones de llamada se pueden utilizar actionRunCallback() Combinar con esto clickable(…) .

Botones con modificadores en los que se puede hacer clic

Sin embargo, antes de implementar la lógica real en cualquiera de estas devoluciones de llamada, se debe verificar el procesamiento de estado.

Resumen de uso

Para que el widget rastree correctamente la cantidad de veces que el usuario ha aumentado el contador, necesita rastrear el estado; esto se puede hacer a través de los componentes proporcionados por Glance.De regreso AddWaterClickAction , Esta onRun() La función se puede modificar:

Agregar lógica de agua

Aquí, la función de suspensión updateAppWidgetState(…) Proporcione acceso y edite el alcance del almacenamiento de datos.En este caso, debido a PreferencesGlanceStateDefinition Pasado como parámetro, use SharedPreferences de Android.Puede utilizar el método apropiado para recuperar el valor en SharedPreferences Preferences.Key Depende del tipo de valor de retorno esperado. En este caso (por la cantidad de tazas de agua), intPreferencesKey Usado.

Una vez recuperado, la función compara el número de vasos almacenados con el límite superior definido (en este caso, se usa 999 solo para evitar que el usuario aumente el contador indefinidamente), y si no se excede el límite, el valor se incrementa en uno. . Después de hacer esto, WaterWidget().update(context, glanceId) Llamado para actualizar el estado del widget con nuevos datos.

La constante es WATER_WIDGET_PREFS_KEY y MAX_GLASSES Puede definirse en el objeto complementario WaterWidget clase:

Constantes para WaterWidget

por ClearWaterClickAction La lógica es más simple:

Lógica Shimizu

Similar a otra devolución de llamada, esta devolución de llamada accede al valor almacenado de la misma cantidad de vasos. Sin embargo, esta función establecerá el valor almacenado en cero, restableciendo así el progreso diario del usuario.

Una vez que estos valores se almacenan correctamente, se puede acceder a ellos desde el estado del propio widget.

Ponlo todo junto

En «WaterWidgetContent.kt», puede crear una función componible para encapsular cada componente individual del widget y exponer el contexto y el estado de cada componente.

Contenido del widget de agua

Aquí, Glance usa LocalContext.current Proporcione el contexto del widget para cada componible, mientras stateDefinition Se sobrescribe para proporcionar el estado. Dado que SharedPreferences se utilizó para almacenar el valor en la devolución de llamada, PreferencesGlanceStateDefinition Se usa para acceder a ellos nuevamente. ahora, currentState() Se puede utilizar en funciones componibles para recuperar los datos necesarios.Como antes, se puede utilizar la cantidad de vasos que el usuario ha bebido hoy WATER_WIDGET_PREFS_KEY Y páselo a cada componente de texto.

Como se mencionó anteriormente, el GlanceAppWidget Contiene un componible Content() Función, aquí es donde se puede llamar a esta función componible. Una vez completado el diseño, puede agregar widgets funcionales a la pantalla de inicio.

El widget incluye contenido
Agregar widget a la pantalla de inicio

Dado que Glance aún se encuentra en sus primeras etapas, este código puede cambiarse, pero es de esperar que esta aparición temprana pueda ayudar a resolver lo que está a punto de suceder.

LEER  Introducción a Hilt en la serie MAD Skills | Autor: Manuel Vivo | Desarrollador de Android | Agosto de 2021

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba