Otra semana más, dos conceptos más. Y éstos son los últimos dos conceptos complejos que veamos. El resto serán un poco más sencillos. Hoy hablaremos de cómo gestionar la información en Android y algo muy importante que fue introducido en HoneyComb: el ActionBar.
13. Gestores de contenidos (Content Provider)
Un Content Provider administra acceso a un repositorio central de datos. Un proveedor es parte de la aplicación Android, la cual a menudo ofrece su propia interfaz gráfica para trabajar con datos. Sin embargo, los Content Providers son pensados principalmente para ser usados por otras aplicaciones, que accedan al proveedor por medio de un cliente.
Para acceder a los datos de un Content Provider usaremos un objeto cliente ContentResolver. Este objeto nos proporciona métodos para el básico «CRUD» (Create, retrieve, update, delete) del almacenamiento persistente de datos. Actúa como una capa de abstracción entre su repositorio de datos y la apariencia externa de los datos como tablas. Como siempre, para poder utilizarlo, necesitamos asignar permisos en el Manifest.
Este sería un ejemplo de query:
Una Content URI es una URI que identifica datos en un proveedor. Incluye el nombre simbólico del proveedor completo (autoridad) y un nombre que apunta a una tabla (path). Cuando llamamos a un método del cliente, estos datos son uno de los argumentos.
A partir de aquí, la gestión es bastante similar a como se hace en base de datos, refiriéndome al concepto de queries, cursores… Por tanto, tampoco vamos a exterdernos mucho en este punto, sino tan sólo comentar las cosas básicas y aportar los enlaces a ejemplos oficiales de código.
Para solicitar datos a un proveedor, necesitaremos construir una query. Para ver un ejemplo de una query simple, mi recomendación es visitar este enlace.
Modificar datos será similar, pudiendo ver ejemplos en el siguiente enlace.
Pero supongamos que no queremos crear nuestro propio Content Provider, sino que queremos rescatar ciertos datos del teléfono para usarlos en nuestra aplicación. Este es el caso del Calendar o los Contactos. Cada uno tendrá su propio proveedor, de forma que podremos disponer de esta información en nuestra aplicación, siempre y cuando le hayamos dado permisos en el Manifest.
En el caso del Calendar utilizaremos el Calendar Provider y en el caso de los Contactos utilizaremos el Contacts Provider.
Con esto, podremos relacionar nuestras aplicaciones mediante los Content Providers, así como utilizar datos externos a nuestra app como son los eventos de Calendario o los Contactos.
14. La barra de acciones ActionBar
Cuando Google rediseñó Android, incluyendo la interfaz Holo, entre otras cosas trajo consigo el ActionBar. Éste es una característica de la ventana que identifica la localización del usuario en la aplicación y nos proporciona tanto acciones posibles a realizar por el usuario, como modos de navegación. Podríamos resumir sus funciones clave en las siguientes:
- Proporcionar un espacio dedicado para la identidad de la aplicación
- Proporcionar un espacio dedicado para identificar dónde está el usuario dentro de la aplicación
- Facilitar las acciones importantes de forma accesible y predictiva
- Soportar navegación consistente, especialmente en los cambios entre diferentes vistas
Esta funcionalidad fue añadida para Android HoneyComb 3.0, pero ¿qué pasaría si quisiéramos poder utilizarla en una versión anterior de Android? Simplemente tendremos que utilizar la librería de soporte, por ejemplo la librería appcompat v7 support, en la cual nos basaremos para el resto del artículo.
Para añadir el ActionBar, bastaría extender nuestra actividad de la clase ActionBarActivity (de la librería de soporte) y utilizar uno de los temas Theme.AppCompat como tema de nuestra actividad. En el caso de que no necesitemos esa compatibilidad, podremos utilizar la clase Activity normal y usar uno de los temas Theme.Holo.
Para eliminar el ActionBar, bastará llamar el método hide:
También podemos añadir elementos de acción, de forma que las acciones más importantes las veremos en todo momento en nuestro ActionBar, y las menos importantes las podemos ocultar en el botón overflow (los famosos tres puntos).
Para añadir un menú de acciones, deberemos seguir los siguientes pasos:
- Crear el menú en la carpeta res
- Sobreescribir el método onCreateOptionsMenu
- Para decidir si queremos mostrar siempre o sólo si hay espacio el elemento de menú, utilizaremos la propiedad showAsAction
- Siempre tenemos que definir el título (title) para cada elemento ya que:
- Si no hay suficiente espacio, el elemento aparecerá en el desplegable del elemento overflow sólo con el título
- Las pantallas optimizadas para invidentes leerán dicho título
- Si sólo vemos el icono, al hacer un click largo con el dedo, veremos el texto
Una vez añadidos los elementos, basta con gestionar los eventos al hacer click sobre cada elemento de menú:
Además, podremos hacer uso del Split ActionBar, que básicamente consiste en que si falta espacio se añada una segunda barra donde ya dispondremos de más espacio. Para ello tendremos que añadir la opción uiOptions = «splitActionBarWhenNarrow» a cada actividad declarada en nuestro Manifest o directamente a la aplicación entera. Pero hay que tener en cuenta que esta opción fue añadida en la API 14 de Android, y si queremos soportarlo en versiones anteriores, deberemos añadir un <meta-data> como hijo de cada actividad que declare dicho valor.
Otra cosa que podemos añadir en el ActionBar es que el icono de la izquierda (el icono de la aplicación) nos permita navegar a la pantalla justamente superior. Para ello, deberemos llamar al método setDisplayHomeAsUpEnabled. Otra opción es declarar en el Manifest para cada actividad cuál será su actividad padre (sólo disponible desde Android 16).
Más cosas que podemos añadir y vemos en algunas aplicaciones son los cuadros de diálogo de búsqueda. Para ello utilizaremos un ActionView.
Y podremos gestionar que se expanda y colapse dicha ActionView:
También podemos añadir un Action Provider, como por ejemplo es el caso del típico botón que podemos ver para compartir:
Otro elemento típico son las pestañas, para las cuales necesitaremos:
- Implementar la interfaz ActionBar.TabListener
- Instanciar ActionBar.Tab para cada pestaña y asignar el escuchador con el método setTabListener. Con setTitle y setIcon personalizaremos la pestaña.
- Añadir cada pestaña al ActionBar a través del método addTab
Otro elemento que podemos añadir es una navegación desplegable. Para ello:
- Crearemos un SpinnerAdapter, el cual nos proporcionará la lista de elementos de la lista desplegable.
- Implementaremos ActionBar.OnNavigationListener para definir el comportamiento que necesitamos para cada elemento
- En el método onCreate de nuestra actividad, habilitaremos la navegación desplegable llamando a setNavigationMode(NAVIGATION_MODE_LIST)
- Asignaremos el callback para la lista con setListNavigationCallbacks
Como último paso, deberemos personalizar la ActionBar a nuestro estilo y al de nuestra aplicación, mediante los estilos. Pero siempre os recomendaré seguir las guías de estilo de Android.
Si queres ver algunos ejemplos de código, sigue las lecciones que Google nos proporciona sobre ello aquí.
Y hasta aquí los conceptos de hoy.
Ver la sección Aprende Android en 20 conceptos