Crea un widget de Android para tu aplicación

Autor: Lewis Jackson
Fecha De Creación: 13 Mayo 2021
Fecha De Actualización: 1 Mes De Julio 2024
Anonim
Crea un widget de Android para tu aplicación - Aplicaciones
Crea un widget de Android para tu aplicación - Aplicaciones

Contenido


Desde los primeros días del sistema operativo, los widgets para Android han permitido a los usuarios interactuar con sus aplicaciones favoritas, desde la comodidad de su pantalla de inicio. Entonces, ¿cómo se crea un widget de Android?

Para el desarrollador, los widgets le dan a su aplicación una presencia valiosa en la pantalla de inicio del usuario. En lugar de quedar escondido en el cajón de la aplicación, se recordará a los usuarios acerca de su aplicación cada vez miran su pantalla de inicio y obtienen una vista previa del contenido más interesante y útil de su aplicación.

Los widgets le dan a su aplicación una valiosa presencia en la pantalla de inicio del usuario

En este artículo, le mostraré cómo proporcionar una mejor experiencia de usuario al tiempo que animaré a los usuarios a interactuar con su aplicación, ¡creando un widget de Android! Al final de este artículo, habrá creado un widget de colección desplazable que muestra un conjunto completo de datos en la pantalla de inicio del usuario.


Para asegurarse de que está entregando el tipo de widget que los usuarios querer para colocar en su pantalla de inicio, también crearemos una Actividad de configuración, que permitirá a los usuarios personalizar el contenido, la apariencia y las características del widget. Finalmente, mostraré cómo puede alentar a las personas a usar su widget, creando una imagen de Vista previa del widget que muestre lo mejor que su widget tiene para ofrecer.

Lea también: Desarrollando para dispositivos plegables: lo que necesita saber

¿Qué son los widgets para Android?

Un widget de aplicación es una aplicación ligera y en miniatura que vive en la pantalla de inicio del usuario.

Los widgets para Android pueden proporcionar una variedad de contenido, pero generalmente se dividen en una de las siguientes categorías:


  • Widget de información. Este es un widget no desplazable que muestra cierta información, como el pronóstico del tiempo de hoy o la fecha y hora.
  • Widgets de colección. Este es un widget desplazable que muestra un conjunto de datos relacionados, formateados como ListView, GridView, StackView o AdapterViewFlipper. Los widgets de recopilación generalmente están respaldados por una fuente de datos, como una base de datos o una matriz.
  • Controlar widgets. Estos widgets actúan como un control remoto que permite a los usuarios interactuar con su aplicación, sin tener que traerlo al primer plano. Las aplicaciones que reproducen medios, como podcasts o música, a menudo tienen widgets de control que permiten al usuario activar acciones de Reproducir, Pausar y Saltar directamente desde su pantalla de inicio.
  • Widgets híbridos. A veces puede ofrecer una mejor experiencia de usuario combinando elementos de varias categorías. Por ejemplo, si está desarrollando un widget de control para una aplicación de música, puede proporcionar los controles Reproducir, Pausa y Saltar, pero también puede decidir mostrar cierta información, como el título y el artista de la canción. Si decides mezclar y combinar, ¡no te dejes llevar! Los widgets tienden a ofrecer la mejor experiencia de usuario cuando brindan un fácil acceso a una pequeña cantidad de información relevante y oportuna o algunas características de uso común. Para ayudar a mantener sus widgets híbridos livianos, se recomienda que identifique la categoría principal de su widget, la desarrolle de acuerdo con esa categoría y luego agregue algunos elementos de la categoría secundaria del widget.

¿Mi proyecto realmente necesita un widget de aplicación?

Hay varias razones por las que deberías considerar agregar un widget de aplicación a tu proyecto de Android.

Los widgets para Android pueden mejorar la experiencia del usuario

Como regla general, cuantos menos pasos de navegación se requieran para completar una tarea, mejor será la experiencia del usuario.

Al proporcionar un widget de aplicación, puede eliminar varios pasos de navegación de los flujos más utilizados de su aplicación. En el mejor de los casos, sus usuarios podrán obtener la información que necesitan simplemente mirando su pantalla de inicio o realizando la tarea deseada simplemente tocando un botón en su widget de control.

Más potente que los accesos directos a aplicaciones

Los widgets de aplicaciones a menudo responden a eventos onClick iniciando el nivel superior en la aplicación asociada, similar a un acceso directo de la aplicación. Sin embargo, los widgets también pueden proporcionar acceso directo a actividades específicas dentro de una aplicación, por ejemplo, al tocar la notificación Nueva recibida de un widget se puede iniciar la aplicación asociada con la nueva ya abierta.

Al incrustar múltiples enlaces en el diseño de su widget, puede proporcionar acceso con un solo toque a todas las actividades más importantes de su aplicación, eliminando aún más pasos de navegación de sus flujos más utilizados.

Al incrustar múltiples enlaces en el diseño de su widget, puede proporcionar acceso con un toque a todas las actividades más importantes de su aplicación.

Tenga en cuenta que los widgets responden solo a eventos onClick, lo que evita que los usuarios interactúen accidentalmente con su widget mientras se desplazan por la pantalla de inicio. La única excepción es cuando el usuario intenta eliminar su widget arrastrándolo hacia la acción Eliminar de su pantalla de inicio, ya que en este escenario su widget responderá a un gesto de deslizamiento vertical.

Esta interacción es administrada por el sistema Android, por lo que no debe preocuparse por implementar manualmente el soporte de deslizamiento vertical en su widget.

Cree un widget de Android para impulsar el compromiso a largo plazo

Convencer a las personas para que descarguen su aplicación es solo el primer paso para crear una aplicación de Android exitosa. Lo más probable es que si tomas tu propio teléfono inteligente o tableta Android y deslizas el dedo por el cajón de aplicaciones, ¡descubrirás varias aplicaciones que no has usado en días, semanas o incluso meses!

Lee también:Introducción al SDK de Facebook para Android

Una vez que su aplicación se haya instalado correctamente en el dispositivo del usuario, deberá trabajar arduamente para mantenerlos interesados ​​y disfrutar de su aplicación. Darle presencia a su aplicación en la pantalla de inicio puede ser una herramienta poderosa para ayudar a impulsar el compromiso a largo plazo, simplemente porque es un recordatorio constante de que su aplicación existe.

Un widget bien diseñado también puede servir como un anuncio continuo para su aplicación. Cada vez que el usuario mira su pantalla de inicio, su widget tiene la oportunidad de alentarlo activamente a volver a interactuar con su aplicación, presentándole todo el contenido más interesante y útil de su aplicación.

Crear un widget de aplicación de colección

En este tutorial, crearemos un widget de colección que muestra una matriz como ListView desplazable.

Para ayudarlo a rastrear el ciclo de vida del widget de la aplicación, este widget también activará varias tostadas a medida que se mueva a través de los diferentes estados del ciclo de vida. Hacia el final de este tutorial, mejoraremos nuestro widget con una imagen de vista previa personalizada que se mostrará en el Selector de widgets de Android y una Actividad de configuración, que permitirá a los usuarios personalizar el widget antes de colocarlo en su pantalla de inicio.

Crea un nuevo proyecto de Android con la configuración que elijas y ¡comencemos!

Construyendo el diseño de tu widget

Para comenzar, definamos la interfaz de usuario (IU) del widget.

Los widgets de la aplicación se muestran en un proceso fuera de su aplicación, por lo que solo puede usar diseños y vistas compatibles con RemoteViews.

Al crear su diseño, está restringido a lo siguiente:

  • Reloj analogo
  • Botón
  • Cronómetro
  • FrameLayout
  • Diseño de cuadrícula
  • ImageButton
  • ImageView
  • Diseño lineal
  • Barra de progreso
  • Disposición relativa
  • Vista de texto
  • ViewStub
  • AdapterViewFlipper
  • Vista en cuadrícula
  • Vista de la lista
  • StackView
  • ViewFlipper

Tenga en cuenta que las subclases de las clases y vistas anteriores son no soportado.

Cree un nuevo archivo de recursos de diseño llamado list_widget.xml. Dado que mostraremos nuestros datos utilizando ListView, este diseño sirve principalmente como contenedor para un elemento:

Rellenar el widget de colección

Luego, necesitamos crear un proveedor de datos para nuestro ListView. Cree una nueva clase Java llamada DataProvider.java y agregue lo siguiente:

importar android.content.Context; importar android.content.Intent; importar android.widget.RemoteViews; importar android.widget.RemoteViewsService; import java.util.ArrayList; import java.util.List; importar android.R.id.text1 estático; importar android.R.layout.simple_list_item_1 estático; DataProvider de clase pública implementa RemoteViewsService.RemoteViewsFactory {List myListView = new ArrayList <> (); Contexto mContext = null; DataProvider público (contexto de contexto, intento de intención) {mContext = context; } @Override public void onCreate () {initData (); } @Override public void onDataSetChanged () {initData (); } @Override public void onDestroy () {} @Override public int getCount () {return myListView.size (); } @Override public RemoteViews getViewAt (int position) {RemoteViews view = new RemoteViews (mContext.getPackageName (), simple_list_item_1); view.setTextViewText (text1, myListView.get (posición)); vista de retorno; } @Override public RemoteViews getLoadingView () {return null; } @Override public int getViewTypeCount () {return 1; } @Override public long getItemId (int position) {return position; } @Override public boolean hasStableIds () {return true; } initData privado vacío () {myListView.clear (); for (int i = 1; i <= 15; i ++) {myListView.add ("elemento ListView" + i); }}}

AppWidgetProvider: configuración de su widget

Para crear un widget de Android, debe crear varios archivos.

Nuestro primer archivo específico de widget es un AppWidgetProvider, que es un BroadcastReceiver donde definirá los diversos métodos del ciclo de vida del widget, como el método que se llama cuando se crea su widget por primera vez y el método que se llama cuando ese widget finalmente se elimina.

Cree una nueva clase Java (Archivo> Nuevo> Clase Java) denominada CollectionWidget.

Para comenzar, todos los archivos del proveedor de widgets deben extenderse desde la clase AppWidgetProvider. Luego debemos cargar el archivo de recursos de diseño list_widget.xml en un objeto RemoteViews e informar al AppWidgetManager sobre el objeto RemoteViews actualizado:

public class CollectionWidget extiende AppWidgetProvider {static void updateAppWidget (Context context, AppWidgetManager appWidgetManager, int appWidgetId) {// Instancia el objeto RemoteViews // RemoteViews views = new RemoteViews (context.getPackageName (), R.layout.list_widget); setRemoteAdapter (contexto, vistas); // Solicitar que AppWidgetManager actualice el widget de la aplicación // appWidgetManager.updateAppWidget (appWidgetId, views); }

Crea el adaptador

Como estamos mostrando nuestros datos en ListView, necesitamos definir un método setRemoteAdapter () en nuestro AppWidgetProvider. SetRemoteAdapter () es equivalente a llamar a AbsListView.setRemoteViewsAdapter () pero está diseñado para usarse en widgets de aplicaciones.

En este método, debemos definir la identificación de AdapterView (R.id.widget_list) y la intención del servicio que eventualmente proporcionará los datos a nuestro RemoteViewsAdapter; en breve crearemos esta clase de WidgetService.

setRemoteAdapter vacío estático privado (Contexto contextual, @NonNull vistas remotas finales RemoteViews) {views.setRemoteAdapter (R.id.widget_list, nueva intención (contexto, WidgetService.class)); }}

Definir los métodos del ciclo de vida del widget

En nuestro AppWidgetProvider, también necesitamos definir los siguientes métodos de ciclo de vida del widget:

Recuperando nuevo contenido con onUpdate

El método del ciclo de vida del widget onUpdate () es responsable de actualizar las Vistas de su widget con nueva información.

Este método se llama cada vez:

  • El usuario realiza una acción que activa manualmente el método onUpdate ().
  • Ha transcurrido el intervalo de actualización especificado de la aplicación.
  • El usuario coloca una nueva instancia de este widget en su pantalla de inicio.
  • Se envía una intención de transmisión ACTION_APPWIDGET_RESTORED al AppWidgetProvider. Esta intención de transmisión se activa si el widget alguna vez se restaura desde la copia de seguridad.

Aquí también es donde registrará los controladores de eventos que debe utilizar su widget.

Al actualizar un widget de Android, es importante recordar que los usuarios pueden crear varias instancias del mismo widget. Por ejemplo, tal vez su widget sea personalizable y el usuario decida crear varias "versiones" que muestren información diferente o proporcionen acceso a una funcionalidad única.

Cuando llama a onUpdate (), debe especificar si está actualizando cada instancia de este widget, o solo una instancia específica. Si desea actualizar cada instancia, puede usar appWidgetIds, que es una matriz de ID que identifica cada instancia en el dispositivo.

En el siguiente fragmento, estoy actualizando cada instancia:

@Override public void onUpdate (Contexto contextual, AppWidgetManager appWidgetManager, int appWidgetIds) {for (int appWidgetId: appWidgetIds) {// Actualizar todas las instancias de este widget // updateAppWidget (context, appWidgetManager, appWidgetId); } super.onUpdate (contexto, appWidgetManager, appWidgetIds); }

Tenga en cuenta que para ayudar a mantener el código directo, este método onUpdate () no está realizando ningún cambio en el widget.

onEnabled: Realizando la configuración inicial

El método de ciclo de vida onEnabled () se llama en respuesta a ACTION_APPWIDGET_ENABLED, que se envía cuando se agrega una instancia de su widget a la pantalla de inicio para primero hora. Si el usuario crea dos instancias de su widget, se llamará a onEnabled () para la primera instancia, pero no para el segundo.

El método de ciclo de vida onEnabled () es donde debe realizar cualquier configuración que sea necesaria para todas las instancias de su widget, como crear la base de datos que alimentará la información de su widget.

Voy a mostrar un brindis, para que pueda ver exactamente cuándo se llama a este método de ciclo de vida:

@Override public void onEnabled (Contexto contextual) {Toast.makeText (contexto, "onEnabled llamado", Toast.LENGTH_LONG) .show (); }

Tenga en cuenta que si el usuario elimina todas las instancias de su widget y luego crea una nueva instancia, esta se clasifica como la primera instancia, y el método del ciclo de vida onEnabled () se llamará nuevamente.

Limpieza, con onDisabled

Se llama al método onDisabled () en respuesta a ACTION_APPWIDGET_DISABLED, que se activa cuando el usuario elimina último instancia de tu widget.

Este método de ciclo de vida del widget es donde debe limpiar los recursos que creó en el método onEnabled (), por ejemplo, eliminando la base de datos que creó en onEnabled ().

Para ayudar a mantener nuestro código sencillo, simplemente mostraré un brindis cada vez que se active este método:

@Override public void onDisabled (contexto contextual) {Toast.makeText (contexto, "onDisabled llamado", Toast.LENGTH_LONG) .show (); }

El AppWidgetProvider completado

Su archivo CollectionWidget ahora debería verse así:

importar android.appwidget.AppWidgetManager; importar android.appwidget.AppWidgetProvider; importar android.content.Context; importar androidx.annotation.NonNull; importar android.content.Intent; importar android.widget.RemoteViews; importar android.widget.Toast; // Amplíe desde la clase AppWidgetProvider // clase pública CollectionWidget extiende AppWidgetProvider {actualización estática vacía AppWidget (contexto contextual, AppWidgetManager appWidgetManager, int appWidgetId) {// Cargue el archivo de recursos de diseño en un objeto RemoteViews // RemoteViews views = new RemoteViews (contexto. getPackageName (), R.layout.list_widget); setRemoteAdapter (contexto, vistas); // Informar a AppWidgetManager sobre el objeto RemoteViews // appWidgetManager.updateAppWidget (appWidgetId, views); } @Override public void onUpdate (Context context, AppWidgetManager appWidgetManager, int appWidgetIds) {for (int appWidgetId: appWidgetIds) {updateAppWidget (context, appWidgetManager, appWidgetId); } super.onUpdate (contexto, appWidgetManager, appWidgetIds); } @Override public void onEnabled (contexto de contexto) {Toast.makeText (contexto, "onEnabled llamado", Toast.LENGTH_LONG) .show (); } @Override public void onDisabled (contexto contextual) {Toast.makeText (contexto, "onDisabled llamado", Toast.LENGTH_LONG) .show (); } setRemoteAdapter privado estático vacío (Contexto contextual, @NonNull vistas remotas finales RemoteViews) {views.setRemoteAdapter (R.id.widget_list, nueva intención (contexto, WidgetService.class)); }}

El archivo AppWidgetProviderInfo

El widget de su aplicación también requiere un archivo AppWidgetProviderInfo, que define varias propiedades importantes, incluidas las dimensiones mínimas de su widget y la frecuencia con la que debe actualizarse.

El archivo AppWidgetProviderInfo se almacena en la carpeta res / xml de su proyecto.

Si su proyecto aún no contiene esta carpeta, deberá crearla:

  • Mantenga presionada la tecla Control y haga clic en la carpeta res de su proyecto.
  • Seleccione Nuevo> Directorio de recursos de Android.
  • En la ventana siguiente, abra el menú desplegable Tipo de recurso y seleccione xml.
  • El nombre del directorio debería actualizarse a xml automáticamente, pero si no es así, deberá cambiarlo manualmente.
  • Haga clic en Aceptar.

Luego, cree un archivo collection_widget_info, que usaremos como nuestro AppWidgetProviderInfo:

  • Mantenga presionada la tecla Control y haga clic en la carpeta xml de su proyecto.
  • Seleccione Nuevo> Archivo de recursos XML.
  • Denomine este archivo collection_widget_info.
  • Haga clic en Aceptar.

En nuestro archivo AppWidgetProviderInfo, necesitamos definir las siguientes propiedades:

1. android: previewImage

Este es el dibujo que representa el widget de su aplicación en el Selector de widgets del dispositivo.

Si no proporciona una imagen de vista previa, Android utilizará el icono de su aplicación en su lugar. Para alentar a los usuarios a seleccionar su widget desde el Selector de widgets, debe proporcionar un dibujo que muestre cómo se verá su widget una vez que esté configurado correctamente en la pantalla de inicio del usuario.

La forma más fácil de crear una imagen de vista previa es utilizar la aplicación Widget Preview que se incluye en el emulador de Android. Esta aplicación le permite configurar su widget y luego generar una imagen, que luego puede usar en su proyecto de Android.

Crearemos esta imagen una vez que hayamos terminado de construir nuestro widget, por lo que por ahora utilizaré el recurso mipmap / ic_launcher generado automáticamente como una imagen de vista previa temporal.

2. android: widgetCategory

Los widgets de aplicaciones deben colocarse dentro de un host de widgets de aplicaciones, que generalmente es la pantalla de inicio de Android, pero también puede ser un iniciador de terceros, como Evie Launcher o Nova Launcher.

Entre los niveles API 17 y 20, fue posible colocar widgets de aplicaciones en la pantalla de inicio o la pantalla de bloqueo, pero el soporte de la pantalla de bloqueo quedó en desuso en el nivel 21 de API.

Puede especificar si el widget de su aplicación se puede colocar en la pantalla de inicio, la pantalla de bloqueo (a la que Android se refiere como "bloqueo de teclas") o ambos, utilizando el atributo android: widgetCategory. Dado que no es posible colocar widgets en la pantalla de bloqueo en las versiones más recientes de Android, estaremos orientados solo a la pantalla de inicio.

Para preservar la privacidad del usuario, su widget no debe mostrar información confidencial o privada cuando se coloca en la pantalla de bloqueo.

Si le da a los usuarios la opción de colocar su widget en la pantalla de bloqueo, cualquiera que eche un vistazo al dispositivo del usuario podría ver su widget y todo su contenido. Para ayudar a preservar la privacidad del usuario, su widget no debe mostrar ninguna información confidencial o privada cuando se coloca en la pantalla de bloqueo. Si su widget contiene datos personales, puede considerar proporcionar diseños de pantalla de inicio y de pantalla de bloqueo por separado.

3. android: initialLayout

Este es el archivo de recursos de diseño que su widget debe usar cuando se coloca en la pantalla de inicio, que para nuestro proyecto es list_widget.xml.

4. android: resizeMode = ”horizontal | vertical”

El atributo android: resizeMode le permite especificar si su widget se puede cambiar de tamaño horizontal, vertical o a lo largo de ambos ejes.

Para garantizar que su widget se muestre y funcione correctamente en una variedad de pantallas, se recomienda que cambie el tamaño de su widget horizontalmente y verticalmente, a menos que tenga una razón específica para no hacerlo.

5. android: minHeight y android: minWidth

Si su widget es redimensionable, entonces debe asegurarse de que el usuario no reduzca su widget hasta el punto en que quede inutilizable. Puedes usar los atributos minHeight y minWidth para definir lo más pequeño que se reducirá tu aplicación cuando el usuario la cambie de tamaño.

Estos valores también representan el tamaño inicial de su widget, por lo que si su widget no es redimensionable, minHeight y minWidth definirán el tamaño permanente del widget.

6. android: updatePeriodMillis

AppWidgetProviderInfo también es donde especificará con qué frecuencia su widget debe solicitar nueva información.

El intervalo de actualización admitido más pequeño es una vez cada 1800000 milisegundos (30 minutos). Incluso si declaras un intervalo de actualización más corto, tu widget solo se actualizará una vez cada media hora.

Si bien es posible que desee mostrar la información más reciente lo más rápido posible, el sistema será activar un dispositivo para dormir para recuperar nueva información. Las actualizaciones frecuentes pueden quemarse a través de la batería de un dispositivo, especialmente durante los períodos en que el dispositivo permanece inactivo durante un período de tiempo significativo, como durante la noche. Brindar la mejor experiencia de usuario posible significa lograr un equilibrio entre limitar el consumo de batería y proporcionar nueva información en un plazo razonable.

También debe tener en cuenta el tipo de contenido que mostrará su widget.

También debe tener en cuenta el tipo de contenido que mostrarán sus widgets para Android. Por ejemplo, un widget del clima solo puede necesitar recuperar un pronóstico actualizado una vez al día, mientras que una aplicación que muestra las últimas noticias tendrá que actualizarse con más frecuencia.

Para encontrar este equilibrio perfecto, es posible que deba probar su widget en un rango de frecuencias de actualización y medir el impacto en la duración de la batería y la puntualidad del contenido de su widget. Si tiene un grupo de probadores dispuestos, incluso podría configurar las pruebas A / B para ver si algunas frecuencias de actualización se reciben de manera más positiva que otras.

También lea: AndroidManifest.xml todo lo que necesitas saber

Finalmente, una vez que haya identificado el intervalo de actualización perfecto, puede utilizar un intervalo más corto al desarrollar y probar su aplicación. Por ejemplo, podría usar la frecuencia de actualización más corta posible (android: updatePeriodMillis = ”1800000 ″) cuando esté probando que el método onUpdate () de su aplicación se está activando correctamente y luego cambie este valor antes de lanzar su aplicación al público en general.

El AppWidgetProviderInfo completado

El archivo collection_widget_info.xml terminado debería verse así:

¡No abarrotes la pantalla de inicio del usuario!

Para garantizar que la pantalla de inicio nunca se vea desordenada, agregaremos algunos rellenos y márgenes a nuestro widget. Si su proyecto aún no contiene un archivo dimens.xml, deberá crear uno:

  • Mantenga presionada la tecla Control y haga clic en la carpeta de valores de su proyecto.
  • Seleccione Nuevo> Archivo de recursos de valores.
  • Dé a este archivo el nombre de dimens.
  • Haga clic en Aceptar.

Abra su archivo dimens.xml y defina los siguientes valores de margen y relleno:

10dp 8dp

Enviar datos al widget

A continuación, necesitamos crear un servicio de widgets, que será responsable de enviar nuestros datos de recopilación al widget.

Cree una nueva clase Java (Nueva> Clase Java) denominada WidgetService y agregue lo siguiente:

importar android.content.Intent; importar android.widget.RemoteViewsService; public class WidgetService extiende RemoteViewsService {@Override public RemoteViewsFactory onGetViewFactory (Intención de intención) {return new DataProvider (this, intent); }}

Registrar su widget en el manifiesto

Ahora necesitamos hacer algunos cambios en el Manifiesto de nuestro proyecto.

Para comenzar, abra el Manifiesto y registre su widget como BroadcastReceiver. También necesitamos agregar un filtro de intención para la acción android.appwidget.action.APPWIDGET_UPDATE:

A continuación, debe especificar el proveedor de widgets de la aplicación:

Finalmente, debemos declarar el servicio que enviará datos a nuestro widget, que en este caso es la clase WidgetService. Este servicio requiere el permiso android.permission.BIND_REMOTEVIEWS:

Pon tu widget a prueba

Si ha seguido este tutorial, ahora tendrá un widget de colección completo que muestra un conjunto de datos en la pantalla de inicio del usuario.

Si se trata de un proyecto de Android de la vida real, normalmente expandiría los métodos del ciclo de vida, particularmente el método onUpdate (), pero esto es todo lo que necesitamos para crear un widget que pueda instalar y probar en su dispositivo Android:

  • Instale este proyecto en un teléfono inteligente, tableta o AVD (dispositivo virtual Android) compatible con Android.
  • Mantenga presionada cualquier sección vacía de la pantalla de inicio y seleccione Widgets cuando se le solicite; esto inicia el selector de widgets.
  • Deslice el dedo por el selector de widgets hasta que encuentre el widget de la aplicación que acaba de crear.
  • Mantenga presionado este widget para agregarlo a su pantalla de inicio.
  • Dado que esta es la primera instancia de este widget en particular, el método onEnabled () debería ejecutarse, y verá un brindis "onEnabled llamado".
  • Cambia el tamaño de tu widget. Si establece un tamaño mínimo admitido, compruebe que no puede reducir el widget más allá de este valor.
  • Pruebe que se desplaza ListView, como se esperaba.
  • A continuación, debe verificar el método onDisabled (), eliminando su widget. Mantenga presionado el widget y luego seleccione Eliminar de la pantalla de inicio. Dado que esta es la última instancia de este widget en particular, el método onDisabled () debería ejecutarse, y verá un brindis "onDisabled llamado".

Esto es todo lo que necesita para entregar un widget de aplicación de Android que funcione, pero hay algunas adiciones que a menudo pueden mejorar la experiencia del usuario. En las siguientes secciones, alentaremos a los usuarios a elegir este widget del Selector de widgets, creando una imagen de vista previa que muestre el widget de la mejor manera. También le mostraré cómo crear un widget totalmente personalizable, agregando una Actividad de configuración a su proyecto.

Crear una imagen de vista previa del widget de Android

Si tomas tu dispositivo Android y deslizas el dedo por el Selector de widgets, verás que cada widget está representado por una imagen, que generalmente muestra cómo se verá este widget una vez que esté configurado en la pantalla de inicio del usuario.

Para alentar a los usuarios a seleccionar su widget, debe proporcionar una imagen de vista previa que resalte toda la información útil y las características que su widget tiene para ofrecer.

Puede crear rápida y fácilmente una imagen de vista previa, utilizando la aplicación Widget Preview que se incluye en el emulador de Android.

Tenga en cuenta que Widget Preview no está incluido en las últimas imágenes del sistema Android, por lo que deberá crear un AVD con Nougat (API Nivel 25) o anterior:

  • Instale su aplicación en un AVD que ejecuta API 25 o inferior.
  • Abra el cajón de la aplicación AVD e inicie la aplicación Widget Preview.
  • La Vista previa del widget mostrará una lista de todas las aplicaciones que están instaladas actualmente en este AVD; seleccione su aplicación de la lista.

  • Su widget ahora se mostrará en un fondo en blanco. Dedique un tiempo a cambiar el tamaño y ajustar su widget hasta que muestre lo mejor que su widget tiene para ofrecer.
  • Una vez que esté satisfecho con la apariencia y el contenido de su widget, seleccione Tomar instantánea.

  • Para recuperar su instantánea, vuelva a Android Studio y seleccione Ver> Herramientas Windows> Explorador de archivos del dispositivo en la barra de herramientas. Esto inicia el Explorador de archivos de dispositivo de Android Studio.
  • En el Explorador de archivos del dispositivo, navegue hasta sdcard / Download. Debería encontrar su imagen de vista previa guardada en el siguiente formato: _ori_.png

  • Arrastre esta imagen fuera de Android Studio y suéltela en un lugar fácilmente accesible, como su Escritorio.
  • Dé a este archivo de imagen un nombre descriptivo.
  • Arrastre y suelte el archivo en la carpeta dibujable de su proyecto.
  • Abra su AppWidgetProviderInfo, que para este proyecto es collection_widget_info.xml.
  • Busque la línea android: previewImage = ”@ mipmap / ic_launcher” y actualícela para hacer referencia a su imagen de vista previa.

Su widget ahora usará este nuevo recurso de imagen como imagen de vista previa:

  • Instale el proyecto actualizado en su dispositivo Android físico o AVD.
  • Mantenga presionada cualquier sección vacía de la pantalla de inicio.
  • Toque Widgets, que inicia el Selector de widgets.
  • Desplácese hasta su widget; ahora debería estar usando la imagen de vista previa actualizada.

Widgets personalizables: agregar una actividad de configuración

Una Actividad de configuración se inicia automáticamente cuando el usuario coloca cada instancia de su widget en su pantalla de inicio.

Hay varias razones por las que es posible que desee agregar una Actividad de configuración a su proyecto.

los widgets tienden a proporcionar la mejor experiencia de usuario cuando brindan acceso a la información o características que son más importantes para el usuario individual.

En primer lugar, algunos widgets requieren una configuración inicial, por ejemplo, un widget que muestra alertas de tráfico puede necesitar conocer la dirección particular del usuario, dónde trabajan y las horas en que normalmente viajan. ¡Sin alguna forma de ingresar esta información, su widget podría ser completamente inútil!

Además, los widgets tienden a proporcionar la mejor experiencia de usuario cuando brindan acceso a la información o características que son más importantes para el usuario individual. Al agregar una Actividad de configuración a su proyecto, puede dar a los usuarios la libertad de elegir exactamente qué está incluido en tu widget.

Incluso las personalizaciones relativamente sencillas, como cambiar el fondo o la fuente de un widget, pueden tener un impacto positivo en la experiencia del usuario; después de todo, ¡nadie apreciará un widget que choque visualmente con el resto de su pantalla de inicio!

¡Nadie apreciará un widget que choca visualmente con el resto de su pantalla de inicio!

Alternativamente, a veces puede tener una larga lista de contenido que desea incluir en su widget, y está luchando por reducir sus opciones. Una actividad de configuración puede ser una forma de aprovechar todas sus ideas, sin creando un widget desordenado y confuso. Solo tenga en cuenta que configurar un widget no debería parecer una tarea difícil, por lo que si proporciona una Actividad de configuración, se recomienda que se limite a tres opciones de configuración.

¡Agreguemos una Actividad de configuración a nuestro proyecto!

En primer lugar, nuestra actividad de configuración necesita un diseño, por lo tanto, cree un nuevo archivo de recursos de diseño llamado config_activity.xml.

Voy a agregar los siguientes botones a este diseño:

  • Un botón de configuración. En un proyecto de la vida real, este botón modificaría el widget de alguna manera, por ejemplo, agregando o eliminando contenido, o cambiando la frecuencia con la que se actualiza el widget. Para ayudar a mantener nuestro código sencillo, al hacer clic en este botón simplemente se mostrará un brindis de Opciones de configuración.
  • Un botón de configuración. Una vez que el usuario esté satisfecho con la configuración de su widget, al presionar este botón colocará el widget recién configurado en su pantalla de inicio.

Aquí está mi archivo config_activity.xml completo:

Crear la actividad de configuración

Ahora, necesitamos crear nuestra Actividad de configuración.

Para comenzar, cree una nueva clase Java llamada ConfigActivity. En esta Actividad, recuperaremos el ID del widget de la aplicación de la intención que lanzó la Actividad de configuración. Si esta intención no tiene un ID de widget, entonces tendremos que llamar al método finish ():

Intención intent = getIntent (); Paquete extras = intent.getExtras (); if (extras! = null) {appWidgetId = extras.getInt (AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); if (appWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) {terminar (); }

A continuación, debemos crear una intención de devolución, pasar el appWidgetId original y establecer los resultados de la Actividad de configuración:

Intención resultValue = new Intent (); resultValue.putExtra (AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); setResult (RESULT_OK, resultValue); terminar(); }}}

Si proporciona una Actividad de configuración, la transmisión ACTION_APPWIDGET_UPDATE no se enviará automáticamente cuando se inicie la Actividad de configuración, lo que significa el método onUpdate () no ser llamado cuando el usuario crea una instancia de su widget.

Para garantizar que su widget se cree con información y contenido actualizados, su actividad de configuración debe desencadenar la primera solicitud onUpdate ().

Aquí está la ConfigActivity completa:

importar android.app.Activity; importar android.appwidget.AppWidgetManager; importar android.os.Bundle; importar android.widget.Button; importar android.content.Intent; importar android.view.View; importar android.view.View.OnClickListener; importar android.widget.Toast; La clase pública ConfigActivity extiende la actividad {@Override protected void onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); setContentView (R.layout.config_activity); setResult (RESULT_CANCELED); Button setupWidget = (Botón) findViewById (R.id.setupWidget); setupWidget.setOnClickListener (nuevo OnClickListener () {@Override public void onClick (View v) {handleSetupWidget ();}}); Button configButton = (Botón) findViewById (R.id.configButton); configButton.setOnClickListener (nuevo OnClickListener () {@Override public void onClick (View v) {handleConfigWidget ();}}); } private void handleSetupWidget () {showAppWidget (); } Private Void handleConfigWidget () {Toast.makeText (ConfigActivity.this, "Opciones de configuración", Toast.LENGTH_LONG) .show (); } int appWidgetId; showAppWidget privado vacío () {appWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID; Intención intent = getIntent (); Paquete extras = intent.getExtras (); if (extras! = null) {appWidgetId = extras.getInt (AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); if (appWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) {terminar (); } // HACER: Realizar la configuración // Intent resultValue = new Intent (); resultValue.putExtra (AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); setResult (RESULT_OK, resultValue); terminar(); }}}

Una vez que haya creado una Actividad de configuración, debe declarar esta Actividad en el Manifiesto y especificar que acepta la acción APPWIDGET_CONFIGURE:

Finalmente, dado que se hace referencia a una Actividad de configuración fuera del alcance del paquete, debemos declarar esta Actividad en nuestro AppWidgetProviderInfo, que en este caso es el archivo collection_widget_info.xml:

android: configure = "com.jessicathornsby.collectionwidget.ConfigActivity">

Probar tu proyecto

Ahora es el momento de poner a prueba su proyecto terminado:

  • Instale su proyecto actualizado en un dispositivo Android físico o AVD.
  • Elimine todas las instancias anteriores de su widget para asegurarse de que está trabajando con la última versión.
  • Mantenga presionada cualquier área vacía de la pantalla de inicio y seleccione Widgets cuando se le solicite.
  • Encuentra tu widget en el selector de widgets y mantén presionado para seleccionarlo.
  • Suelta el widget en tu pantalla de inicio. La actividad de configuración debería iniciarse automáticamente.
  • Haga clic en el botón Realizar alguna configuración, y debería aparecer un brindis de Opciones de configuración, confirmando que esta interacción se ha registrado con éxito.
  • Imagine que ha modificado la configuración del widget y ahora está listo para colocarlo en su pantalla de inicio; toque el botón Crear el widget, y este widget se debe crear correctamente.

Puede descargar el proyecto de widget de colección completado desde GitHub.

Terminando

En este artículo, creamos un widget de colección desplazable que muestra un conjunto de datos en la pantalla de inicio del usuario.

Si desea continuar trabajando con este proyecto, puede intentar agregar su propio código al método onUpdate () para crear un widget que se actualice con nueva información en el intervalo definido en su archivo AppWidgetProviderInfo (collection_widget_info).

Si creas un widget de Android, ¡asegúrate de compartir tus creaciones en los comentarios a continuación!

No hay nada como tener pria y decubrir que tu la batería del auto tuvo un funeral in ti. Etá varado, frutrado, y tal vez tu teléfono también etá en u última etapa. El kit...

La realidad virtual etá empezando a convertire en un gran problema. La proliferación de auriculare como Oculu Rift, HTC Vive, Playtation VR y otro han olidificado la popularidad de la plata...

Interesante