Acceso a recursos (Resources) de Android

Hay muchas cosas que se utilizan para construir una excelente aplicación de Android. Además de la codificación de la aplicación, debes prestar atención a diversos recursos, como los diversos contenidos estáticos que usas, como mapas de bits, colores, definiciones de diseños, cadenas de interfaz de usuario, animaciones, etc. Estos recursos generalmente se colocan en subdirectorios independientes bajo res/ del proyecto.

En este tutorial aprenderás cómo organizar los recursos de la aplicación, especificar recursos alternativos y acceder a ellos en la aplicación.


Organización de recursos en Eclipse

Debes colocar cada tipo de recurso en un subdirectorio específico del directorio res/ del proyecto. Por ejemplo, esta es la jerarquía de archivos de un proyecto simple:

MyProject/
    src/  
        MyActivity.java  
    res/
        drawable/  
            icon.png  
        layout/  
            activity_main.xml
            info.xml
        values/  
            strings.xml 

El directorio res/ contiene todos los recursos en varios subdirectorios. Aquí hay un recurso de imagen, dos recursos de diseño y un archivo de recursos de cadena. La siguiente tabla detalla los recursos admitidos en el directorio res/ del proyecto.

Directorio Tipo de recurso
anim/ Archivos XML que definen propiedades de animación. Se guardan en la carpeta res/anim/ y se accede a ellos mediante la clase R.anim.
color/ Archivos XML que definen listas de estados de color. Se guardan en la carpeta res/color/ y se accede a ellos mediante la clase R.color.
drawable/ Archivos de imagen, como .png, .jpg, .gif o archivos XML, que se compilan en mapas de bits, listas de estados, formas, imágenes animadas. Se guardan en la carpeta res/drawable/ y se accede a ellos mediante la clase R.drawable.
layout/ Archivos XML que definen diseños de interfaz de usuario. Se guardan en la carpeta res/layout/ y se accede a ellos mediante la clase R.layout.
menu/ Archivos XML que definen menús de la aplicación, como menús de opciones, menús contextuales, submenús, etc. Se guardan en la carpeta res/menu/ y se accede a ellos mediante la clase R.menu.
raw/ Archivos arbitrarios guardados en su forma original. Para abrir archivos raw, se debe llamar a Resource.openRawResource() según el ID de recurso llamado R.raw.filename.
values/ Archivos XML que contienen valores simples (como cadenas, enteros, colores, etc.). Aquí hay algunas convenciones de nomenclatura de recursos en estas carpetas. arrays.xml representa recursos de arreglos (arrays), que se acceden mediante la clase R.array; integers.xml representa recursos de enteros, que se acceden mediante la clase R.integer; bools.xml representa recursos de booleanos, que se acceden mediante la clase R.bool; colors.xml representa recursos de colores, que se acceden mediante la clase R.color; dimens.xml representa recursos de dimensiones, que se acceden mediante la clase R.dimen; strings.xml representa recursos de cadenas, que se acceden mediante la clase R.string; styles.xml representa recursos de estilos, que se acceden mediante la clase R.style.
xml/ Puedes leer cualquier archivo XML en tiempo de ejecución llamando a Resources.getXML(). Puedes guardar aquí varios archivos de configuración utilizados en tiempo de ejecución.

Recursos alternativos

Tu aplicación necesita proporcionar soporte de recursos alternativos para configuraciones de dispositivo específicas. Por ejemplo, necesitas proporcionar recursos de imagen alternativos para diferentes resoluciones de pantalla y recursos de cadena alternativos para diferentes idiomas. En tiempo de ejecución, Android detecta la configuración actual del dispositivo y carga los recursos adecuados para la aplicación.

Para determinar un conjunto de recursos alternativos para una configuración específica, sigue los siguientes pasos:

  • Crea un nuevo directorio bajo res/ con el nombre <resource_name>_<config_qualifier>. Aquí, resource_name es cualquiera de los recursos mencionados en la tabla anterior, como diseños, imágenes, etc. El qualifier determinará qué recursos se utilizan para configuraciones específicas. Puedes consultar la documentación oficial para obtener una lista completa de qualifiers para los diferentes tipos de recursos.
  • Guarda los recursos alternativos correspondientes en este directorio. Estos archivos de recursos deben tener el mismo nombre que los archivos de recursos predeterminados que se muestran en el siguiente ejemplo, pero estos archivos reemplazarán el contenido específico. Por ejemplo: aunque el nombre del archivo de imagen sea el mismo, para pantallas de alta resolución, la resolución de la imagen también será mayor.

A continuación se muestra un ejemplo que especifica una imagen para la pantalla predeterminada y una imagen alternativa de alta resolución.

MyProject/
   src/
    main/
    java/
       MyActivity.java  
       res/
          drawable/  
            icon.png
            background.png
        drawable-hdpi/  
            icon.png
            background.png  
        layout/  
            activity_main.xml
            info.xml
        values/  
            strings.xml

A continuación se muestra otro ejemplo que especifica un diseño para el idioma predeterminado y un diseño alternativo para el idioma árabe.

MyProject/
   src/
    main/
    java/
       MyActivity.java  
      res/
         drawable/  
            icon.png
            background.png
        drawable-hdpi/  
            icon.png
            background.png  
        layout/  
            activity_main.xml
            info.xml
        layout-ar/
            main.xml
        values/  
            strings.xml

Acceso a recursos

En el desarrollo de aplicaciones, es necesario acceder a los recursos definidos, ya sea mediante código o mediante archivos XML. Las siguientes secciones explican cómo acceder a los recursos en cada uno de estos dos escenarios.

Acceso a recursos en código

Cuando una aplicación de Android se compila, se genera una clase R que contiene los ID de todos los recursos en el directorio res/. Puedes usar la clase R para acceder a los recursos mediante subclase + nombre del recurso o usando directamente el ID del recurso.

Ejemplo

Para acceder a res/drawable/myimage.png y establecerlo en un ImageView, usarás el siguiente código:

ImageView imageView = (ImageView) findViewById(R.id.myimageview);
imageView.setImageResource(R.drawable.myimage);

Aquí, la primera línea de código usa R.id.myimageview para obtener el ImageView definido como myimageview en el archivo de diseño. La segunda línea usa R.drawable.myimage para obtener la imagen llamada myimage en el subdirectorio drawable de res/.

Ejemplo

Considera el siguiente ejemplo, donde res/values/strings.xml tiene la siguiente definición:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string  name="hello">Hello, World!</string>
</resources>

Ahora puedes usar el ID de recurso para establecer el texto en un objeto TextView con ID msg, de la siguiente manera:

TextView msgTextView = (TextView) findViewById(R.id.msg);
msgTextView.setText(R.string.hello);

Ejemplo

Considera el diseño res/layout/activity_main.xml definido de la siguiente manera:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="fill_parent" 
   android:layout_height="fill_parent" 
   android:orientation="vertical" >

   <TextView android:id="@+id/text"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Hello, I am a TextView" />

   <Button android:id="@+id/button"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Hello, I am a Button" />

</LinearLayout>

El código de esta aplicación cargará este diseño para la actividad, en el método onCreate(), de la siguiente manera:

public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.main_activity);
}

Acceso en XML

Considera el siguiente archivo de recursos XML res/values/strings.xml, que contiene un recurso de color y un recurso de cadena:

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <color name="opaque_red">#f00</color>
   <string name="hello">Hello!</string>
</resources>

Ahora, puedes usar estos recursos en el siguiente archivo de diseño para establecer el color del texto y el contenido del texto:

<?xml version="1.0" encoding="utf-8"?>
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:textColor="@color/opaque_red"
    android:text="@string/hello" />

Ahora, si vuelves al ejemplo de "Hello World!" explicado en el capítulo anterior, estoy seguro de que tendrás una mejor comprensión de todos los conceptos de esta sección. Por lo tanto, te recomiendo encarecidamente que vuelvas a ver el ejemplo anterior y revises el uso básico de los diferentes recursos que he utilizado.

Otras extensiones