Es recomendable almacenar de forma externa los recursos como imágenes o cadenas de caracteres que vayas a utilizar en la aplicación respecto al código fuente de la misma. De esa manera puedes proporcionar recursos alternativos que soporten configuraciones específicas de los dispositivos tales como diferentes lenguajes o tamaños de pantalla. Para proporcionar compatibilidad entre las diferentes configuraciones que ofrecen los dispositivos Android, debes organizar los recursos en la carpeta res del proyecto, usando varias subcarpetas que agrupen los recursos por tipo y configuración.

Agrupamiento de recursos

Cada tipo de recurso debe almacenarse en una subcarpeta específica dentro de la carpeta res del proyecto. Por ejemplo, en un proyecto sencillo se puede tener una estructura de recursos como la siguiente:

recursos01 studioRes01

En la imagen puedes ver que la carpeta res contiene todos los recursos, organizados en subcarpetas. Es importante respetar el nombre de las carpetas creadas para almacenar los recursos. Los nombres que puedes utilizar son los siguientes (se indica el tipo de archivos que deben contener):

  • animator: Ficheros XML que definen las propiedades de las animaciones.
  • anim: Ficheros XML que definen las propiedades de las tween animations (animaciones de objetos View). También puede almacenar las propiedades de las animaciones de cualquier tipo, pero para eso es recomendable usar la carpeta animator.
  • color: Ficheros XML que definen una lista de estados de colores, permitiendo cambiar el color de un elemento según su estado.
  • drawable: Archivos de imagen (.png, .9.png, .jpg, .gif) o ficheros XML compilados como recursos de imagen.
  • layout: Ficheros XML que definen la estructura (layout) de una vista.
  • menu: Ficheros XML que definen los menús de la aplicación, tales como menú de opciones, menú contextual o submenús.
  • raw: Ficheros de cualquier tipo con su formato correspondiente. Para acceder a los ficheros contenidos en esta carpeta res/raw, deben tener un identificador que haga referencia a cada fichero. Si se necesita acceder al fichero usando su nombre real y jerarquía de subcarpetas en la que se encuentre, hay que almacenarlo en la carpeta assets (como subcarpeta del proyecto). En cualquier caso todos estos ficheros sólo se pueden utilizar en modo lectura.
  • values: Ficheros XML que contienen valores, como cadenas de caracteres (strings), tamaños (dimens) o colores (colors). Cada recurso se define dentro de su propio elemento XML, por lo que puedes nombrar el fichero como quieras y puedes situar recursos de diferentes tipo en un solo fichero. Sin embargo, es recomendable por claridad que se sitúe cada tipo de recurso en ficheros diferentes. Para ello, hay un convenio sobre los nombres de ficheros de recursos a utilizar en esta carpeta:
    • arrays.xml: Para arrays
    • colors.xml: Para valores de colores.
    • dimens.xml: Para valores de dimensiones.
    • strings.xml: Para valores de cadenas de caracteres.
    • styles.xml: Para estilos predefinidos.
    • xml: Fichero XML de cualquier tipo que pueden ser leídos durante la ejecución.

Recursos alternativos

Para cualquier tipo de recurso, puedes especificar cuáles van a ser los recursos usados por defecto y los recursos alternativos. Los recursos usados por defecto son aquellos que deberían ser usados sin considerar la configurar específica del dispositivo o cuando no hay recursos alternativos que coincidan con la configuración actual. Los recursos alternativos son aquellos que has diseñado para que sean usados con una configuración específica. Para especificar que un grupo de recursos están asociados a una configuración específica, debe añadir un sufijo al nombre de la carpeta relacionándola con una determinada configuración. Se debe seguir el siguiente formato para nombrar la carpeta:

res/tipoRecurso-cualificador

Por ejemplo, mientras la estructura del intefaz de usuario (layout) está guardada en la carpeta res/layout, puedes especificar un layout diferente para ser usado cuando la pantalla esté en sentido apaisado, para lo cual debes guardarlo en la carpeta res/layout-land.

Android aplicará automáticamente los recursos apropiados relacionando la configuración actual del dispositivo con los nombres de las carpetas de recursos.

En las siguientes imágenes puedes ver cómo el sistema aplica el layout a dos dispositivos diferentes. En el primer caso, se muestra la situación en la que no hay recursos alternativos disponibles, por lo que se aplica el mismo layout. Pero en el segundo caso hay un recurso de layout alternativo para pantallas grandes, por lo que se utilizan layouts diferentes.

resource devices diagram1 resource devices diagram2

(Imágenes tomadas de la web developer.android.com)

A continuación puedes encontrar los posibles nombres de cualificadores que puedes usar, agrupados por categorías:

  • MCC y MNC:
    • Código de país de móvil (mobile country code MCC) seguido opcionalmente del código de red de móvil (mobile network code) de la tarjeta SIM que tenga el dispositivo.
  • Idioma y región:
    • El código de idioma está definido por 2 letras según ISO 639-1, y puede ir seguido opcionalmente del código de región ISO 3166-1-alpha-2precedido del carácter 'r'.
      • Por ejemplo, "es" para Español de cualquier región, o "es-rES" para español de España y "es-rMX" para español de México. "en" es inglés para cualquier región, "en-rUS" es inglés de Estados Unidos y "en-rGB" es inglés de Gran Bretaña.
  • Menor tamaño de pantalla:
    • Indica el tamaño más pequeño de la pantalla (considerando tanto alto como ancho). Esta medida es indiferente de la orientación de la pantalla. Se indica la medida precedida de "sw" y seguida de "dp", por ejemplo sw320dp o sw720dp. Desde API 13.
  • Ancho disponible:
    • Especifica el ancho mínimo de pantalla disponible, cambiando su valor cuando la orientación de la pantalla varíe entre apaisado o vertical considerando en cada caso el ancho correspondiente. Se indica la medida precedida de "w" y seguida de "dp", por ejemplo w720dp w1024dp. Desde API 13.
  • Altura disponible:
    • Especifica la altura mínima de pantalla disponible de manera similar a la anterior. Por ejemplo: h720dp o h1024dp. Desde API 13.
  • Tamaño de pantalla:
    • small: 320x426 dp aprox.
    • normal: 320x470 dp aprox.
    • large: 480x640 dp aprox.
    • xlarge: 720x960 dp aprox. Desde API 9.
  • Aspecto de la pantalla:
    • long: Pantallas largas como WQVGA, WVGA y FWVGA.
    • notlong: Pantallas menos largas como QVGA, HVGA y VGA.
  • Orientación de la pantalla:
    • port: (Portrait) Modo retrato (vertical)
    • land: (Landscape) Modo apaisado (horizontal)
  • Modo de interfaz de usuario(desde API 8):
    • car: Dispositivo conectado a un soporte (dock) de coche.
    • desk: Dispositivo conectado a un soporte de escritorio.
    • television: Dispositivo mostrado en una televisión. Desde API 13.
    • appliance: Dispositivo actuando como appliance (diseñado para actuar para un propósito específico), sin pantalla.
  • Modo nocturno(desde API 8):
    • night: En horario nocturno.
    • notnight: En horario diurno.
  • Densidad de puntos de pantalla(dpi):
    • ldpi: 120dpi aprox.
    • mdpi: 160dpi aprox.
    • hdpi: 240dpi aprox.
    • xhdpi: 320dpi aprox. (desde API 8)
    • nodpi: Se puede usar para imágenes que no se desea escalar en función de la densidad de pantalla.
    • tvdpi: Entre mdpi y hdpi. 213dpi aprox. (desde API 13)
    • Hay un ratio de escala de 3:4:6:8 entre los cuatro primeros tipos de densidad. Así, una imagen de 9x9 en ldpi es de 12x12 en mdpi, 18x18 en hdpi y 24x24 en xhdpi.
  • Tipo de pantalla táctil:
    • notouch: No tiene pantalla táctil.
    • finger: Tiene pantalla táctil.
  • Disponibilidad de teclado:
    • keysexposed: El dispositivo tiene un teclado físico disponible.
    • keyshidden: Tiene un teclado físico pero está oculto.
    • keyssoft: Tiene un teclado virtual (por software).
  • Tipo de teclado físico:
    • nokeys: El dispositivo no tiene teclas físicas.
    • qwerty: Tiene un teclado físico tipo qwerty.
    • 12key: Tiene un teclado físico de 12 teclas.
  • Disponibilidad de teclas de navegación:
    • navexposed: Las teclas de navegación están disponibles.
    • navhidden: Las teclas de navegación no están disponibles.
  • Método principal de navegación no táctil:
    • nonav: El dispositivo no tiene otro medio de navegación que no sea la pantalla táctil.
    • dpad: Tiene un pad (teclado) direccional.
    • trackball: Tiene un trackball (bola).
    • wheel: Tiene ruedas para la navegación (poco común).
  • Versión de la plataforma:
    • Nivel de API soportado por el dispositivo. Por ejemplo, v3, v4, v7, etc.

Los nombres de cualificadores deben seguir además una reglas:

  • Se pueden especificar varios cualificadores a un mismo conjunto de recursos, separándolos por guiones. Por ejemplo: drawable-en-rUS-land se aplicaría a dispositivos configurados con el idioma inglés de Estados Unidos y cuando esté en modo apaisado.
  • Los cualificadores deben estar en el orden de la lista anterior. Por ejemplo:
    • Incorrecto: drawable-hdpi-port
    • Correcto: drawable-port-hpdi
  • Las carpetas de recursos alternativos no pueden ser anidadas. Por ejemplo:
    • Incorrecto: res/drawable/drawable-en
    • Correcto: res/drawable-en
  • Los nombres de cualificadores no consideran las diferencias entre mayúsculas y minúsculas.
  • Sólo es válido un valor para cada tipode cualificador. Por ejemplo:
    • Incorrecto: drawable-es-fr
    • Correcto: drawable-es y otra carpeta drawable-fr.
    • Lo que sí se puede hacer es crear alias entre recursos.

Android utilizará automáticamente en la aplicación los recursos basados en la configuración actual del dispositivo. Cada vez que se solicita un recursos, Android comprueba si hay carpetas de recursos alternativos que contengan el recurso solicitado y entonces localiza el recurso que mejor se adapta a la configuración actual. Si no hay recursos alternativos para la configuración actual, Android usará los recursos correspondientes por defecto (los que no incluyen un cualificador).

Creación de carpetas de recursos

Una manera sencilla de crear las carpetas de recursos usando diferentes cualificadores es usando el asistente que ofrece Android Studio. Haciendo clic derecho sobre la carpeta de recursos (res), puedes seleccionar la opción New > Android recource directory (también accesible desde el menú File > New).

studioRes02

Aparecerá una ventana de diálogo donde puedes seleccionar el tipo de recursos que vas a almacenar en la carpeta (Resource type), y los cualificadores deseados para esa carpeta que debes ir seleccionando de la lista de cualificadores disponibles (Available qualifiers). Con los botones de las flechas a derecha o izquierda podrás ir seleccionando y eliminando los cualificadores deseados que aparecerán en la lista de cualificadores elegidos (Chosen qualifiers). Según el tipo de cualificador elegido, en la parte más derecha deberás indicar el valor concreto para ese cualificador. A medida vayas realizando las selecciones deseadas, irá cambiando automáticamente el nombre de la carpeta que aparece en la parte superior (Directory name).

studioRes03

Al finalizar podrás ver la carpeta que se habrá creado dentro de la carpeta res, con el nombre en función del tipo de recurso seleccionado y los cualificadores elegidos.

studioRes06

Creación de archivos de recursos

De manera similar a la creación de carpetas de recursos, se pueden crear directamente archivos de recursos usando el asistente de Android Studio. El archivo que se genere se almacenará automáticamente en la carpeta correspondiente al tipo de recurso y cualificadores seleccionados. Si la carpeta no existiera se creará también de forma automática.

En este caso deberás seleccionar, en el menú contextual de la carpeta res, la opción New > Android resource file.

studioRes04

Al igual que en el caso anterior, podrás seleccionar el tipo de recurso y los cualificadores deseados, pero además deberás indicar el nombre del archivo.

studioRes05