martes, 15 de mayo de 2012

Trabajando con recursos en Android


En el entorno de desarrollo Android, gran peso de lo que construyamos en nuestras aplicaciones reside directamente en el uso de recursos, que son información, archivos, elementos estáticos que se encuentran albergados fuera del código Ya has hecho uso de los layouts para definir tus interfaces de usuario. Los layout también son recursos.
Existen muchos tipos de recursos que puedes utilizar y que puedes agregar a tu . Es cierto que podemos manejar los directorios con los nombres de nuestra preferencia pero resulta una best practice seguir convenciones a la hora de elaborar nuestra estructura de directorios ya que esto permite unificar nuestro trabajo y podrás ver su beneficio si te encuentras trabajando en equipo.
Todos los recursos se encuentran dentro del directorio res de nuestros proyectos Android. Con la excepción de los recursos de tipo raw que se guardan en un directorio con este mismo nombre, todos los demás recursos que utilicemos deberán parsearse ya sea que lo hagamos nosotros manualmente o que el propio sistema lo haga. Por ejemplo, cada vez que en una actividad le asignamos un layout para que se muestre, el sistema gestiona el parseo correspondiente:
setContentView(R.layout.main);
Y cuando instanciamos un elemento específico de un layout (llámese Button, EditText, TextView, etc.) hacemos un parseo explícito para que podamos utilizarlo dentro del código java:
TextView text = (TextView) findViewById(R.id.txt);
Entre los recursos que podemos incluir en nuestros proyectos se encuentran:
§  Imágenes (res/drawable), para colocar iconos estáticos u otro tipo de imágenes en la interfaz de usuario.
§  Raw (res/raw), para guardar archivos arbitrarios que tienen una razón de ser en nuestra aplicación pero no necesariamente para Android. Este directorio lo he utilizado para almacenar archivos de audio y video.
§  Strings, colores, arreglos y dimensiones (res/values), para almacenar todos estas constantes que guardan los valores que podemos utilizar dentro de nuestra aplicación que nos ayuda a separar la lógica de la aplicación con el contenido y formato de la misma.
§  XML (res/xml), para almacenar archivos XML estáticos que contienen información o alguna estructura necesaria dentro de nuestra aplicación.

Ventajas de utilizar strings por medio de recursos
Desacoplar la información, no tengo mucho mas para agregar acà, quien ha tenido que refactorizar código, o buscar pequeños cambios (agregar una Ñ o un acento, lo sabe).

Soporte de imágenes en Android
Android soporta imágenes en formato PNG, JPEG y GIF, pese a que este último es un formato que rara vez se utiliza. Por el contrario, el uso de PNG es el más recomendado para trabajar con imágenes. De esta forma, puedes utilizar las imágenes que necesites en tus aplicaciones utilizando el formato la palabra drawable para mandarlos a llamar desde tus archivos XML o desde el código Java.
Únicamente es necesario que coloques tus imágenes en el directorio res/drawable y con esto podrás referenciarlas como un recurso. A primera vista tal vez podrá confundirte un poco el hecho de que existan los directorios drawable-hdpi, drawable-ldpi y drawable-mdpi. Esto se debe a que Android no corre en un sólo dispositivo, sino que corre en infinidad de dispositivos de diferentes fabricantes y con diferentes tamaños de pantalla. Si bien resulta “sencillo” crear nuestros layouts flexibles para que se adapten a cualquier tamaño de pantalla, esto se hace un poco diferente con las imágenes que se mostrarán como iconos y otros elementos de la interfaz. Esta división se hace para que Android “elija” entre los recursos que según la resolución del dispositivo sean los mejores para conservar el look and feel de las aplicaciones.
Por motivos de prueba quizás te resulte menos complicado crear un directorio llamado drawable y dejar de preocuparte por esa parte que finalmente es de la que se encargará el diseñador de tu interfaz de usuario.
Teniendo esto claro, para mandar a llamar una imagen desde un archivo de layout en XML utilizamos el formato @drawable/[nombreDelArchivo]. Si por ejemplo tuviéramos una imagen llamada icon.png, para llamarla, la sentencia correcta sería @drawable/icon.
IMPORTANTE: El nombre del archivo no incluye la extensión de la imagen ya que esto te generará errores en tiempo de compilación. Así también, el formato para los nombres solo debe incluir letras minúsculas y números, si usas mayúsculas y caracteres especiales incluida la “ñ” puedes tener también errores.

Uso del directorio res/xml
Hay ocasiones en las que nos resulta necesario hacer uso de recursos estáticos que definamos en archivos XML, tal puede ser el caso de cuando definimos propiedades para la aplicación, en cuyo caso hacemos uso de la siguiente línea de código para mandar a llamar los valores:
addPreferencesFromResource(R.xml.preferences);
Existen muchas otras aplicaciones que le pueden dar, así que tengan en cuenta que si alguna vez requieren mostrar información estática dentro de la aplicación, el uso de archivos XML puede ser muy útil, ya que además de separar el contenido de la funcionalidad, también te será más fácil editar la información contenida en el archivo.

Uso del directorio res/values
Además de guardar las cadenas de texto en el típico archivo stings.xml del directoriores/values, también es posible guardar otros archivos XML que contengan recursos tales como dimensiones, colores, y arreglos. Cada uno de los archivos XML dónde definamos estos valores deberán tener como elemento raíz a <resources></resources>.
- Dimensiones
Las dimensiones regularmente se utilizan para describir distancias tal como el atributo padding de algún widget. Como sabrás, podemos utilizar distintas unidades de medida aparte de los pixeles:
§  in y mm para pulgadas y milímetros respectivamente, y se basan en el tamaño de la pantalla.
§  pt para puntos. En términos más sencillos, un  punto equivale a 1/72 pulgadas basado en el tamaño de la pantalla.
§  dip y sp para pixeles independientes del dispositivo y pixeles independientes de la escala. Generalmente recomiendo el uso de estas unidades porque son las que nos permiten trabajar más fácil con toda la gama de diferentes tamaños de pantalla de los dispositivos Android.
Para definir una dimensión como recurso dentro de nuestro proyecto utilizamos una etiqueta <dimen..> con un atributo name cuyo valor lo identificará de los otros recursos disponibles. El valor de la dimensión irá dentro de las etiquetas de apertura y cierre (<dimen></dimen>). 

Dentro de un archivo de layout podemos mandar a llamar una dimensión con el formato@dimen/[ValorDelAtributoName]. Si tomamos la primera dimensión definida en el archivo anterior, la sentencia de llamado quedaría como @dimen/thin.
Si deseamos llamar una dimensión desde el código Java, la sentencia a utilizar es R.dimen.thin siguiendo el mismo ejemplo.

- Colores
Los colores en Android son valores en hexadecimal RGB con la opción de definir también el valor para el canal alfa (que indica la transparencia-solidez de un color). De esta manera podemos definir los colores bajo estos formatos:
§  #RGB
§  #ARGB
§  #RRGGBB
§  #AARRGGBB
Sí, como puedes notar, es un formato muy parecido al que utilizamos en las hojas de estilo en cascada para desarrollo web.
En Android, estos valores en RGB  se colocan como cadenas dentro de las etiquetas <color…></color>. Cada una de las etiquetas de apertura <color> poseen un atributo name que es el nombre que identificará al color dentro de la aplicación.

De manera muy similar a las dimensiones, los colores se llaman desde los archivos XML con el formato @color/[NombreDelColor] y desde el código Java con R.color.NombreDelColor.

- Arreglos
Los arreglos están diseñados para guardar listas de strings que queramos desplegar dentro de la aplicación. En el archivo dónde los definimos, necesitamos colocar un elemento raíz con la etiqueta <string-array> cuyo atributo name será el identificador que los diferencie de otro arreglo de valores. Dentro de estas etiquetas colocamos elementos <item></item> que corresponde a cada uno de los valores del arreglo:

Generalmente mandamos a llamar arreglos desde el código Java siguiendo el formatoR.array.NombreDelArreglo.

Para que tengamos una mejor organización y podamos así encontrar cada uno de estos recursos te recomiendo que en los archivos XML que vayas a crear los nombres intuitivamente, es decir, si vas a dedicar un XML a guardar todos los colores que vas a utilizar llámalo como colors.xml y así para cada caso. Es una best practice y créeme que tu equipo de desarrollo te lo agradecerá.
Espero que con esta introducción al uso de recursos en Android se haga más fácil incluir diferentes tipos de archivos en las aplicaciones y además segmentar de mejor manera la parte de formato y contenido de la parte de lógica de la aplicación. Recuerden que en Android trabajamos con el Model-View-Controller por lo que mientras mejor lo implementen mejor irán las aplicaciones.

No hay comentarios:

Publicar un comentario