Posted by : Unknown
domingo, 3 de agosto de 2014
Tipos de recursos
La definición de los recursos en Android es un aspecto muy importante en el diseño de una aplicación. Una de sus principales ventajas es que facilita a los diseñadores gráficos e introductores de contenido trabajar en paralelo con los programadores.
Añadir un recurso a nuestra aplicación es muy sencillo, no tenemos más que añadir un fichero dentro de una carpeta determinada de nuestro proyecto. Para cada uno de los recursos que añadamos el sistema crea, de forma automática, un id de recurso dentro de la clase R.
Tipos de recursos
Según la carpeta que utilicemos el recurso creado será de un tipo específico. Pasamos a enumerar las carpetas y tipos posibles:
carpetaidentificador
|
Descripción
|
res/drawable/
R.drawable |
Ficheros en bitmap (.png, .jpg o .gif). Ficheros PNG en formato Nine-patch (.9.png). Ficheros XML con descriptores gráficos (ver clase Drawable)
|
res/layout/
R.layout |
Ficheros XML con los Layouts usados en la aplicación.
|
res/menu/
R.menu |
Ficheros XML con la definición de menús. Podemos asignar una actividad o una vista.
|
res/anim/
R.anim |
Fichero XML que permiten definir una animaciones Tween también conocidas como animaciones de vista.
|
res/animator
R.animator |
Ficheros XML que permiten modificar las propiedades de un objeto a lo largo del tiempo. Ver sección: animación de propiedades. Solo desde la versión 3.0.
|
res/xml/
R.xml |
Otros ficheros XML, como los ficheros de preferencias
|
res/raw/
R.raw |
Ficheros que se encuentran en formato binario. Por ejemplo ficheros de audio o vídeo.
|
res/values/
|
Ficheros XML que definen un determinado valor para definir un color, estilo, cadena de caracteres… se describen en la siguiente tabla.
|
Veamos los tipos de recursos que encontramos dentro de la carpeta values:
fichero por defectoidentificador
|
Descripción
|
strings.xml
R.string |
Identifica cadenas de caracteres
<string name="saludo">¡Hola Mundo!</string>
|
colors.xml
R.color |
Un color definido en formato ARGB (alfa, rojo, verde y azul). Los valores se indican en hexadecimal en uno de los siguientes formatos: #RGB, #ARGB, #RRGGBB ó #AARRGGBB
<color name="verde_opaco">#0f0</color>
<color name="red_translucido">#80ff0000</color> |
dimensions.xml
R.dimen |
Un número seguido de una unidad de medida.
px - pixeles, mm - milímetros, in – pulgadas, pt – puntos (=1/72 pulgadas), dp – píxeles independientes de la densidad (=1/160 pulgadas), sp – igual que dp pero cambia según las preferencias de tamaño de fuente.
<dimen name="alto">2.2mm</dimen>
<dimen name="tamano_fuente">16sp</dimen> |
styles.xml
R.style |
Definen una serie de atributos que pueden ser aplicados a una vista o a una actividad. Si se aplican a una actividad se conocen como temas.
<style name="TextoGrande"parent="@style/Text">
<item name="android:textSize">20pt</item> <item name="android:textColor">#000080</item> </style> |
R.int
|
Define un valor entero.
<integer name="max_asteroides">5</integer>
|
R.bool
|
Define un valor booleano.
<bool name="misiles_ilimitados">true</bool>
|
R.id
|
Define un recurso de ID único. La forma habitual de asignar ID a los recursos es utilizando el atributo id="@+id/nombre". Aunque en algunos casos puede ser interesante disponer de IDs previamente creados, para que los elementos así nombrados tengan una determinada función. Este tipo de IDs se utilizan en las vistas TabHost y ListView.
<item type="id" name="button_ok"/>
<item type="id" name="dialog_exit"/> |
R.array
|
Una serie ordenada de elementos. Pueden ser de strings, de enteros o de recursos (TypedArray)
<string-array name="dias_semana"> < <item>lunes</item>
<item>martes</item> </string-array>
<integer-array name="primos">
<item>2</item><item>3</item><item>5</item> </integer-array> <array name="asteroides"> <item>@drawable/asteroide1</item> <item>@drawable/asteroide2</item> </array> |
Aunque el sistema crea ficheros que aparecen en la columna de la izquierda de la tabla anterior y se recomienda definir los recursos de cadena dentro de strings.xml, hay que resaltar que no es más que una sugerencia de organización. Sería posible mezclar cualquier tipo de recurso de esta tabla dentro de un mismo fichero y poner a este fichero cualquier nombre.
video[Tutorial] Tipos de recursos en Android
Acceso a los recursos
Una vez definido un recurso este puede ser utilizado desde un fichero XML o desde Java. A continuación se muestra un ejemplo desde XML:
<ImageView
android:layout_height="@dimen/alto"
android:layout_width="match_parent"
android:background="@drawable/asteroide"
android:text="@string/saludo"
android:text_color="@color/verde_opaco"/>
Para acceder a un recurso definido en los ejemplos anteriores desde Java usaremos el siguiente código:
Resources res =getResources();
Drawable drawable =res.getDrawable(R.drawable.asteroide);
String saludo = res.getString(R.string.saludo);
int color =res.getColor(R.color.verde_opaco);
float tamanoFuente =res.getDimension(R.dimen.tamano_fuente);
int maxAsteroides =res.getInteger(R.integer.max_asteroides);
boolean ilimitados = res.getBoolean(R.bool.misiles_ilimitados);
String[] diasSemana =res.getStringArray(R.array.dias_semana);
int[] primos =res.getIntArray(R.array.primos);
TypedArray asteroides =res.obtainTypedArray(R.array.asteroides);
Drawable asteroide1 =asteroides.getDrawable(0);
1. Utilizando el editor visual de vistas previsualiza el Layout activity_main.xml modificado en la práctica anterior.
2. Utiliza el segundo botón de la barra superior para seleccionar una tableta de 10 pulgadas:
3. 
Ha de utilizarse el Layout alternativo creado en la práctica.
4. Selecciona ahora una tableta de 7 pulgadas. Observa como ya no se utilizará este Layout. La razón es que este una tableta de 7 pulgadas se considera de tamaño large y no xlarge. Si quisiéramos aplicar también este Layout para este tamaño, tendríamos que crear una nueva carpeta con sufijo -large y copiar el Layout dentro. Copiar el mismo recurso dos veces no parece muy razonable.
5. Para ajustar nuestros diseños a los tamaños de pantalla en el Nivel de API 13 se introduce una alternativa más práctica: el sufijo -sw o ancho menor:
Veamos cómo se utiliza. Primero se obtiene el menor entre ancho y alto de pantalla disponible y se compara el valor indicado en la carpeta. Solo se cargará el recurso si el valor obtenido es mayor al indicado en la carpeta. Si varias carpetas cumplen la condición se usa la carpeta con mayor valor. Es obligatorio utilizar dp como unidad (1dp=1/160 pulgadas). Este valor no se calcula con el ancho total de la pantalla física, si no con el espacio disponible para la aplicación. Los elementos permanentes del IU del sistema (como botones en pantalla) no se cuentan como espacio disponible.
El uso habitual es para indicar en ancho mínimo que soporta un layout. Hay que recordar que se compara con el mínimo entre ancho y alto, por lo tanto, no afecta cambiar la inclinación de horizontal a vertical. Los valores típicos que se utilizan se muestran a continuación:
sw320dp = 2’ = 50mm (móvil pequeño)
sw480dp = 3’ = 76mm (móvil grande)
sw600dp = 3,75’= 95mm (tableta 7’)
sw720dp = 4,5’ = 114mm (tableta 10’)
6. Crea la carpeta layout-sw600dp-land y copia en ella el fichero activity_main.xml de la carpetalayout-xlarge-land.
7. Elimina la carpeta layout-xlarge-land.
8. Verifica que este Layout es utilizado tanto en carpetas de 7 y 10 pulgadas.
Nota: El sufijo –sw aparece en el nivel de API 13 (v3.2). Esto significa que cuando esta aplicación sea cargada en un dispositivo con una versión anterior a la 3.2 la carpeta que acabamos de crear será ignorada. Esta circunstancia podrá darse dado que, el nivel mínimo de API seleccionado en Mis Lugares es 8 (v2.2).
Crear un nuevo recurso de Layout simplemente para cambiar los márgenes no es una buena idea. Si más adelante decidimos modificarlo, por ejemplo añadiendo un gráfico, tendremos que modificar cada uno de los Layouts creados. Cuando lo que quieras ajustar sea un tamaño (margen, tamaño de letra, ancho, alto, etc.), lo más recomendable es definir un recurso de dimensión y definirlo según el tamaño disponible. Este ejercicio ilustra cómo hacerlo.
1. En el explorador de paquetes busca el proyecto HolaMundo. Expande la capeta res. Observa como al crear un nuevo proyecto se ha creado el fichero dimens.xml en tres carpetas diferentes:
2. Abre el fichero dimens.xml en su versión por defecto (res/values/dimens.xml). Se mostrará:
<resources>
<!-- Default screen margins, per the Android Design guidelines. -->
<dimen name="activity_horizontal_margin">16dp</dimen>
<dimen name="activity_vertical_margin">16dp</dimen>
</resources>
3. Abre el fichero res/values-sw600dp/dimens.xml. Observa como no se incluye ninguna dimensión. Se ha creado para facilitarte la adaptación de los diseños de layout en pantallas de 7 pulgadas o más.
4. Abre el fichero res/values-sw720dp-land/dimens.xml. Se mostrará:
<resources>
<!-- Customize dimensions originally defined in res/values/dimens.xml
(such as screen margins) for sw720dp devices (e.g. 10" tablets) in
landscape here.-->
<dimen name="activity_horizontal_margin">128dp</dimen>
</resources>
5. Tras analizar estos tres ficheros, puedes decir que posibles valores tomarán las dos dimensiones definidas y cuando.
Solición: activity_vertical_margin siempre valdrá 16dp y activity_horizontal_margin valdrá 128dp cuando estemos en una pantalla de más de 10 pulgadas en posición horizontal y en el resto de los casos 16dp.
6. Abre el fichero res/layout/activity_main.xml. Se mostrará:
<RelativeLayout
…
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
… >
Obserba como se están utilizando las dimensiones definidas para indicar los márgenes inferior, izquierdo, derecho y superior.
7. Vamos a aplicar esta filosofía de trabajo a la aplicación Mis Lugares.
8. Abre el fichero MisLugares/res/layout/activity_main.xml. Reemplaza:
<LinearLayout
…
android:padding="30dp"
… >
Por:
<RelativeLayout
…
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
… >
9. Reemplaza:
<TextView
…
android:textSize="25sp"/>
por:
<TextView
…
android:textSize="@dimen/titulo" />
10. Añade a cada uno de los cuatro botones el atributo textSize de la siguiente manera:
<Button
…
android:textSize="@dimen/boton"/>
11. Realiza los cambios de los tres últimos puntos, pero ahora en el fichero res/layout-land/activity_main.xml.
12. Edita el fichero res/dimens.xml para obtener:
<resources>
<dimen name="activity_horizontal_margin">25dp</dimen>
<dimen name="activity_vertical_margin">25dp</dimen>
<dimen name="titulo">25sp</dimen>
<dimen name="boton">16sp</dimen>
</resources>
13. Edita el fichero res/values-sw600dp/dimens.xml para obtener:
<resources>
<dimen name="activity_horizontal_margin">75dp</dimen>
<dimen name="titulo">35sp</dimen>
<dimen name="boton">22sp</dimen>
</resources>
14. Edita el fichero res/values-sw720dp-land/dimens.xml para obtener:
<resources>
<dimen name="activity_horizontal_margin">150dp</dimen>
<dimen name="titulo">45sp</dimen>
<dimen name="boton">30sp</dimen>
</resources>
15. Tras la definiciones introducida ¿Qué valor tomará activity_horizontal_margin, cuando se ejecute la aplicación en una tableta de 110 pulgadas.
Solución: Depende de su posición: en horizontal 150dp y en vertical 75 dp.
16. Borra la carpeta res/layout-sw600dp-land con su contenido. Ya no necesitamos esta layout.
17. Para verificar los resultados no es necesario disponer de tabletas de diferentes tamaños, ni siquiera crear diferentes emuladores. Puedes abrir la edición visual del layout activity_main y previsualizar en diferentes tamaños de pantalla y orientación. Es recomendable para esta prueba que tengas seleccionado en ajuste de zum, para que se ajuste al tamaño real: