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);

Ejercicio paso a paso: Creando un Layout alternativo con el sufijo -sw
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).

  Ejercicio paso a paso: Uso de dimensiones en recursos alternativos
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: 

Leave a Reply

Subscribe to Posts | Subscribe to Comments

- Copyright © Android Arm WorkStation - Blogger Templates - Powered by Blogger - Designed by Johanes Djogan -