El desarrollo de widgets para la plataforma Android implica un conjunto de tareas ligeramente diferente al desarrollo de aplicaciones estándar. En esta serie de tutoriales, trabajaremos en el proceso de desarrollar un widget de reloj analógico personalizable. El reloj se basará en la clase AnalogClock de Android y se personalizará con tus propios gráficos..
Hasta ahora, en esta serie sobre el desarrollo de un widget de reloj analógico personalizado para Android, hemos configurado el proyecto y creado los principales elementos de diseño. En esta parte, implementaremos la clase de widget de Java, el manejo de actualizaciones y también el lanzamiento de la aplicación. Trabajaremos en dos clases de Java, una que extenderá la clase AppWidgetProvider y la otra una clase de actividad que se iniciará si el usuario intenta iniciar la aplicación. También trabajaremos en el archivo de diseño para la Actividad de lanzamiento. Después de este tutorial, tendrá un widget de reloj en funcionamiento que se actualizará continuamente para reflejar la hora actual.
En la parte final de la serie, permitiremos al usuario elegir entre los diseños de relojes que creamos la última vez..
Esta es la parte 3 de nuestra serie sobre cómo crear un widget de reloj analógico de Android personalizable en cuatro tutoriales:
Las aplicaciones de widgets amplían la clase AppWidgetProvider en Android, así que eso es lo que haremos aquí. En esta clase, puede proporcionar pasos de procesamiento para actualizar su widget mientras se ejecuta en la pantalla de inicio del usuario. Nuestra actividad de iniciador utilizará el archivo de diseño XML principal para mostrar un recurso de cadena que definimos en el primer tutorial. En este tutorial, también cubriremos el uso de los iconos del iniciador (y, opcionalmente, de la vista previa) para nuestra aplicación de widget.
Puede recordar que en el primer tutorial, decidimos incluir una Actividad de inicio dentro de la aplicación del widget. Esto no es una necesidad, pero ofrece un par de ventajas. Los usuarios que no saben cómo iniciar una aplicación de widget verán instrucciones sobre cómo iniciarla. Además, los dispositivos que ejecutan Android 4.0 a veces no incluyen nuevas aplicaciones de widgets en el menú, pero el hecho de proporcionar una Actividad de lanzamiento parece evitar este problema..
Cuando creó su proyecto en Eclipse, si especificó una Actividad inicial para la aplicación, Eclipse debería haber creado una clase Java para él. Al usar los pasos predeterminados descritos en la Parte 1, debe tener una clase de Java en su paquete de proyecto llamada "CustomClockWidgetActivity" o un nombre alternativo si lo cambió. Abra esto en Eclipse - debe contener el siguiente esquema:
// nombre del paquete import android.app.Activity; importar android.os.Bundle; la clase pública CustomClockWidgetActivity extiende la actividad / ** Llamada cuando la actividad se crea por primera vez. * / @Override public void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.main);
Si Eclipse no creó la clase, créela ahora y agregue el código, modificando el nombre de la clase si es necesario. Podemos usar el comportamiento predeterminado de esta clase de actividad principal y dejar el código como está. Observe que el código especifica el diseño XML principal para su vista de contenido. Alteraremos el archivo principal de diseño XML para adaptarlo a los detalles de nuestra aplicación de widgets..
La Actividad ya debería estar incluida en el archivo de manifiesto de su proyecto de la siguiente manera:
Aquí indicamos que esta actividad debe comenzar cuando se inicie la aplicación. Esta es la forma en que se muestra una Actividad de iniciador dentro del Manifiesto para una aplicación estándar (no de widget). Aunque nuestro widget generalmente se ejecuta al agregarlo a la pantalla de inicio del usuario, estamos proporcionando una Actividad de inicio por los motivos mencionados anteriormente..
Abra el archivo de diseño XML principal: "res / layout / main.xml". Eclipse debería haber creado este archivo cuando creó el proyecto. La mayoría de este archivo se puede dejar con el código predeterminado, pero queremos agregar el siguiente atributo al elemento TextView para mejorar la legibilidad:
Android: relleno = "10dp"
Su archivo de diseño XML principal ahora debería aparecer como sigue:
El diseño simplemente muestra la cadena de texto "hola" que editamos en la Parte 1 de esta serie. La Cadena instruye al usuario en cuanto a cómo agregar el widget a su pantalla de inicio. Recuerde que incluimos dos versiones de la Cadena, una en la carpeta "valores" y otra en la carpeta "valores-v14", para que podamos adaptar las instrucciones a la versión de Android que el usuario ha instalado..
Con una aplicación de widget, el icono del iniciador aparece en los listados de aplicaciones. En nuestro caso, también aparecerá en el menú principal del dispositivo del usuario porque hemos proporcionado una Actividad de inicio. Puede crear una imagen de vista previa para su widget si lo desea, pero si no lo hace, el icono del iniciador aparecerá en las vistas previas de los widgets. Para los usuarios que ejecutan Android 4.0 y posteriores, los widgets se agregan desde la pestaña Widget en el menú del dispositivo. Dentro de esta sección del menú, aparece la imagen de vista previa o aparecerá el icono de inicio si no se ha proporcionado una vista previa. En los niveles de API anteriores, la vista previa o el icono aparecen en el selector de widgets, después de presionar prolongadamente la pantalla de inicio.
Para nuestro widget de reloj solo usaremos un ícono de inicio, así que crea el tuyo ahora. Puedes usar el siguiente conjunto si aún no quieres diseñar el tuyo:
Use la siguiente guía de tamaño máximo para sus iconos en cada densidad:
Si usa el nombre de archivo "ic_launcher" para el ícono de su lanzador, no debería necesitar alterar ninguno de los códigos como las herramientas predeterminadas para este nombre. Verifique que su proyecto esté usando este nombre abriendo el archivo Manifest y verificando el atributo de icono del elemento de la aplicación, que debe aparecer como sigue:
android: icon = "@ drawable / ic_launcher"
Si no aparece de esta manera, modifique el código para que coincida con el nombre que desea utilizar para el icono del iniciador. Guarde sus copias del icono en cada carpeta dibujable, recuerde usar el mismo nombre en cada carpeta (pero el contenido de la imagen con diferentes tamaños para adaptarse a cada densidad). Si está creando sus propios iconos de inicio, trate de asegurarse de que reflejen la apariencia y la función de su widget de reloj para que los usuarios establezcan de manera intuitiva el vínculo entre el icono y el widget..
Si desea crear imágenes de vista previa para sus aplicaciones de widgets, puede usar la aplicación de vista previa de widgets. Ejecute una aplicación de widget en un AVD en Eclipse (para el widget del reloj, puede hacerlo al final de este tutorial o en el siguiente): asegúrese de que su AVD tenga algún almacenamiento de tarjeta SD asignado. Abra el menú del dispositivo emulador y seleccione la aplicación Widget Preview. Elija su widget de la lista. Una vez que aparezca la imagen de su widget, haga clic en "Tomar instantánea" para capturar una vista previa.
Luego puede guardar la vista previa directamente en su computadora desde Eclipse. Para hacerlo, abra la perspectiva DDMS, seleccione su emulador en la vista Dispositivos y busque la imagen en la vista del Explorador de archivos (busque en el directorio de descargas en la tarjeta SD). Seleccione el archivo de imagen de vista previa y haga clic en el botón "Extraer un archivo del dispositivo" para guardar la imagen en su sistema de archivos local.
Una vez que tenga la imagen de vista previa, cópiela en la (s) carpeta (s) que se puede dibujar del proyecto y anote su nombre en el elemento "res / xml" del archivo de propiedades del widget "appwidget-provider", junto con las dimensiones, el período de actualización y los valores de diseño iniciales, usando el siguiente atributo:
android: previewImage = "@ drawable / clock_preview"
Esto se aplicaría a un archivo de imagen llamado, por ejemplo, "clock_preview.png" guardado en cada carpeta relevante dibujable.
Ahora pasemos a la clase de Java para nuestro widget de reloj. Recuerde que en el proyecto Manifest incluimos un elemento receptor que indica una clase llamada "ClockWidget", que crearemos a continuación. Tómese un momento para mirar el Manifiesto antes de implementar su clase. Observe que el elemento receptor incluye la acción "APPWIDGET_UPDATE" y especifica metadatos que comprenden el archivo XML "clock_widget" en el que definimos las propiedades básicas del widget.
Cree su clase de widget ahora haciendo clic con el botón derecho o seleccionando el paquete de aplicación principal en el directorio "src" y seleccionando "Archivo" y luego "Nuevo", "Clase": ingrese "ClockWidget" para que coincida con el nombre en el Manifiesto. Eclipse debería abrir su nuevo archivo de clase. Extienda la línea de declaración de clase de apertura de la siguiente manera:
La clase pública ClockWidget extiende AppWidgetProvider
Deberá agregar la siguiente declaración de importación sobre esta línea en la parte superior de la clase:
importar android.appwidget.AppWidgetProvider;
Agregue una variable de instancia dentro de la declaración de clase de la siguiente manera:
Vistas de RemoteViews;
Esto nos permitirá referirnos a la interfaz de usuario / elementos visibles para el widget, que requiere un proceso ligeramente diferente en las clases de widgets que en las clases de actividad. Las vistas remotas nos permiten consultar el diseño del widget y las vistas que contiene. Esto es esencial al actualizar y proporcionar funciones interactivas para el widget. Necesitará otra declaración de importación:
importar android.widget.RemoteViews;
A continuación, agregue el esquema del método "onReceive" dentro de la clase de la siguiente manera:
public void onReceive (contexto de contexto, intención de intención)
El AppWidgetProvider hereda este método de la clase BroadcastReceiver. En el siguiente tutorial, usaremos este método para manejar los clics en el widget del reloj. Por el momento, todo lo que tenemos que hacer es indicar a Android que actualice la apariencia del widget cuando se ejecute el método. Agregue primero las siguientes instrucciones de importación:
importar android.content.Context; import android.content.Intent;
Dentro del método "onReceive", incluya una prueba condicional para verificar si el método se está ejecutando porque el widget debe actualizarse:
// encuentra la acción String action = intent.getAction (); // es hora de actualizar si (AppWidgetManager.ACTION_APPWIDGET_UPDATE.equals (action))
Agregue otra declaración de importación:
importar android.appwidget.AppWidgetManager;
Dentro de la declaración "if", recupere las Vistas remotas para nuestro diseño de widgets, creando una instancia de la variable de instancia que creamos de la siguiente manera:
views = new RemoteViews (context.getPackageName (), R.layout.clock_widget_layout);
Observe que usamos el objeto de contexto pasado al método "onReceive" para recuperar el nombre del paquete. Especificamos el archivo de diseño del widget del reloj en el que trabajamos en el último tutorial: si usó un nombre de archivo diferente, modifique este código para reflejarlo. Ahora actualice el widget agregando el siguiente código, aún dentro de la declaración "if":
AppWidgetManager.getInstance (context) .updateAppWidget (intent.getIntArrayExtra (AppWidgetManager.EXTRA_APPWIDGET_IDS), vistas);
Aquí usamos el AppWidgetManager para llamar a la actualización, pasando el objeto de Vistas Remotas como referencia. Ahora puede ejecutar su aplicación de widget para ver su apariencia y comportamiento predeterminados. Cuando la aplicación se instala / inicia inicialmente, la actividad del iniciador se ejecuta:
La Actividad de lanzamiento es meramente informativa, por lo que es mejor en general mantenerlo simple, a menos que tenga algún otro propósito en mente para ello. Aparte de eso, siéntase libre de alterar su apariencia de la forma que desee. Las siguientes capturas de pantalla muestran el widget que se agrega desde el menú del dispositivo del usuario en Ice Cream Sandwich:
Observe que el icono del iniciador aparece en el menú Widget: si incluye una imagen de vista previa y la enumera en su widget XML, aquí aparecerá en su lugar. Finalmente, el widget del reloj se ejecuta utilizando su diseño predeterminado:
Los elementos básicos del widget de reloj analógico ahora están completos. En la siguiente y última parte de la serie de tutoriales, implementaremos permitiendo al usuario elegir un diseño de reloj. El diseño predeterminado del reloj se muestra actualmente porque en el último tutorial configuramos los otros diseños como invisibles. Manejaremos los clics de los usuarios en el widget agregando funcionalidad a la clase de widget. También utilizaremos una nueva Actividad para mostrar la selección de diseños de reloj al usuario, detectar cuál elige y actualizar la apariencia del widget en consecuencia. Finalmente, utilizaremos la aplicación Preferencias compartidas para almacenar un registro del diseño de widget que seleccionó el usuario, haciéndolo personalizable..