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: 

Carpeta
identificador


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/mipmap/
R.mipmap
Ficheros en bitmap (.png, .jpg o .gif). Estos gráficos no son rescaldados para adaptarlos a la densidad gráfica del dispositivo, sino que se buscará en las subcarpetas el gráfico con la densidad más parecida y se utilizará directamente.

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. (Véase apartado "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, etc. Se describen en la siguiente tabla.

 Tabla: Tipos de recursos según carpeta en Android.

Veamos los tipos de recursos que encontramos dentro de la carpeta values:

Fichero por defecto
identificador


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 id previamente creado, para que los elementos así nombrados tengan una determinada función. Este tipo de id se utiliza 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>

Tabla: Tipos de recursos en carpeta values.

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 = ContextCompat.getDrawable(R.drawable.asteroide); 
String saludo = res.getString(R.string.saludo);
int color = ContextCompat.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); 
val drawable = ContextCompat.getDrawable( R.drawable.asteroide)
val saludo = resources.getString(R.string.saludo)
val color = ContextCompat.getColor(R.color.verde_opaco)
val tamanoFuente = resources.getDimension(R.dimen.tamano_fuente)
val maxAsteroides = resources.getInteger(R.integer.max_asteroides)
val ilimitados = resources.getBoolean(R.bool.misiles_ilimitados)
val diasSemana = resources.getStringArray(R.array.dias_semana)
val primos = resources.getIntArray(R.array.primos)
val asteroides = resources.obtainTypedArray(R.array.asteroides)
val asteroide1 = asteroides.getDrawable(0)