miércoles, 19 de enero de 2011

Localizar Recursos por Nombre en Android

Ya hemos visto varias veces como retraer recursos para una aplicación Android, ya sea un archivo de layout, un estilo, textos, etc. Si aun no sabes como retraer recursos en android te recomiendo que leas este articulo dentro de la documentación de android (http://developer.android.com/guide/topics/resources/index.html); básicamente lo que el
sistema hace es asignar un identificador (un numero entero [int]) y un nombre dentro de un
paquete a los recursos que declaramos en nuestra aplicación por el cual pueden ser referenciados en el código o en otros archivos android. Lo que generalmente vemos en una aplicación es algo como esto:
En esta imagen podemos ver como declaramos un TextView en nuestro archivo de layout y hacemos referencia a un recurso string que se llama hello (los recursos se identifican
"@tipo/nombre"), también en ciertas ocasiones es necesario retraer un recurso en código; y esto es logrado de varias maneras:
la mas sencilla es retraer un String desde un contexto, si queremos hacerlo desde una actividad se hace una llamada al método getString(int) donde int es el identificador del recurso, todos los identificadores son registrados y compilados en la clase especial R de android (puedes ver la siguiente pagina para ver la descripción de R).
También es posible retraer un objeto de recursos (android.conte
nt.res.Resources) desde el contexto (ya sea de la actividad o desde la aplicación), en la imagen siguiente se muestra un objeto de recursos que es retraído desde la actividad, desd
e el contexto y desde el contexto de aplicación. En la imagen también se muestra como retraer un String desde los recursos pero se pueden localizar cualquier tipo de recursos con distintos métodos de esta clase y con el id del recurso (puedes ver una descripción en la siguiente pagina).
Lo que les quiero mostrar el día de hoy, es que en ocasiones es necesario localizar un recurso dinamicamente, por ejemplo necesitas cargar un numero determinado de descripciones de configuración (esto fue lo que me paso recientemente), las descripciones de configuración están
guardadas en recursos string ya que es necesario cargar sus descripciones dependiendo del lenguaje de la aplicación y están distinguidas por medio de un Id, por lo tanto cree un método que dado un objeto de recursos y una lista de identificadores de descripciones buscara el texto y lo regresara a la función padre para ser cargada por la aplicación, y el código me quedo mas o menos así:
voy a tratar de explicar lo que intente hacer en este código,
De las lineas 24 a 26 declare un HashMap donde guardare los resultados de las consultas e inicie un ciclo para recorrer todos los ids que fueron pasados a la función. Luego (en la linea 27) cree un string el cual representara el nombre del recurso que quiero retraer, en este caso yo se que todos las descripciones están identificadas de la siguiente manera: sett_description_, por ejemplo sett_description_0 para la primera descripción, luego sett_description_1 y así sucesivamente, lo importante aquí es el código en la linea 28, el cual trata de localizar el identificador del recurso que queremos dentro de nuestro objeto de recursos, el método getIdentifier(String,String,String) espera recibir el nombre del recurso (desName que lo acabamos de construir), el tipo del recurso (string, layout, drawable, etc) en este caso "string" y el nombre del paquete donde se encuentran almacenados los identificadores de nuestros recursos (donde se encuentra la clase R de nuestro proyecto) en este caso "org.blanco.test.viewfliper".
Si este método regresa un identificador valido (si es mayor que 0) retraemos el recurso String con el método getString y lo almacenamos en nuestro resultado, si no guardamos un String por default en este caso "recurso no encontrado" (todo esto de las lineas 29-32. Al final cerramos el ciclo y regresamos el resultado.

Esta es la manera en la que retraje los recursos de una aplicación en forma dinámica, en este pequeño ejemplo utilizamos recursos String pero la idea puede ser aplicada a cualquier tipo de recursos. Espero y esta pequeña demostración les sirva en sus desarrollos si alguna vez se llegan a topar con un caso similar. De igual manera si saben de alguna otra manera en la cual obtener el mismo resultado y que sea mas optima o si tienen alguna duda o comentario les agradezco que dejen un comment en el post.
Saludos

No hay comentarios:

Publicar un comentario