lightbulb_outline Help shape the future of the Google Play Console, Android Studio, and Firebase. Start survey

Acceso a recursos

Una vez que proporciones un recurso en tu aplicación (se trata en Provisión de recursos), puedes aplicarlo al hacer referencia a su ID de recurso. Todos los ID de recursos se definen en la clase R de tu proyecto, que la herramienta aapt genera automáticamente.

Cuando se compila tu aplicación, aapt genera la clase R, que contiene ID de recurso de todos los recursos de tu directorio res/. Para cada tipo de recurso hay una subclase R (por ejemplo, R.drawable para todos los recursos de elementos de diseño), y para cada recurso de ese tipo hay un valor entero estático (por ejemplo, R.drawable.icon). Ese valor entero es el ID del recurso que puedes usar para recuperar tu recurso.

Si bien en la clase R se especifican los ID de recursos, no necesitarás buscar en ella para hallar uno. El ID de recurso siempre está compuesto por:

  • El tipo de recurso: Cada recurso se agrupa en un “tipo”, como string, drawable y layout. Para obtener más información acerca de los diferentes tipos, lee Tipos de recursos.
  • El nombre del recurso, que es el nombre de archivo sin la extensión o el valor en el atributo XML android:name, si el recurso es un valor simple (como una string).

Existen dos maneras de acceder a un recurso:

  • En código: Usando un valor entero de una subclase de tu clase R; por ejemplo:
    R.string.hello

    string es el tipo de recurso y hello es el nombre del recurso. Hay muchas API de Android que pueden acceder a tus recursos cuando proporcionas un ID de recurso en este formato. Consulta Acceso a recursos en código.

  • En XML: Usando una sintaxis XML que también corresponde al ID de recurso definido en tu clase R; por ejemplo:
    @string/hello

    string es el tipo de recurso y hello es el nombre del recurso. Puedes usar esta sintaxis en un recurso XML, en cualquier lugar donde se prevea que proporciones un valor en un recurso. Consulta Acceso a recursos desde XML.

Acceso a recursos en código

Puedes usar un recurso en código al pasar el ID de recurso como un parámetro del método. Por ejemplo, puedes establecer un ImageView para usar el recurso res/drawable/myimage.png con setImageResource():

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

También puedes recuperar recursos individuales con métodos en Resources, del cual puedes obtener una instancia con getResources().

Sintaxis

Esta es la sintaxis que necesitas para hacer referencia a un recurso en código:

[<package_name>.]R.<resource_type>.<resource_name>
  • <package_name> es el nombre del paquete en el que se ubica el recurso (no es necesario cuando haces referencia a recursos desde tu paquete).
  • <resource_type> es la subclase R para el tipo de recurso.
  • <resource_name> es el nombre de archivo del recurso sin la extensión o el valor del atributo android:name en el elemento XML (para valores simples).

Consulta Tipos de recursos para obtener más información acerca de cada tipo de recurso y cómo hacer referencia a ellos.

Casos de uso

Hay muchos métodos que aceptan un parámetro de ID de recurso y puedes recuperar recursos usando métodos en Resources. Puedes obtener una instancia de Resources con Context.getResources().

Aquí te mostramos algunos ejemplos de acceso a recursos en código:

// Load a background for the current screen from a drawable resource
getWindow().setBackgroundDrawableResource(R.drawable.my_background_image) ;

// Set the Activity title by getting a string from the Resources object, because
//  this method requires a CharSequence rather than a resource ID
getWindow().setTitle(getResources().getText(R.string.main_title));

// Load a custom layout for the current screen
setContentView(R.layout.main_screen);

// Set a slide in animation by getting an Animation from the Resources object
mFlipper.setInAnimation(AnimationUtils.loadAnimation(this,
        R.anim.hyperspace_in));

// Set the text on a TextView object using a resource ID
TextView msgTextView = (TextView) findViewById(R.id.msg);
msgTextView.setText(R.string.hello_message);

Advertencia: Nunca debes modificar el archivo R.java manualmente; se genera a través de la herramienta aapt cuando se compila tu proyecto. Los cambios se invalidarán la próxima vez que compiles.

Acceso a recursos desde XML

Puedes definir valores para algunos atributos y elementos XML usando una referencia a un recurso existente. Generalmente harás esto cuando creas archivos de diseño para proporcionar strings e imágenes para tus widgets.

Por ejemplo, si agregas un Button a tu diseño, debes usar un recurso de string para el texto del botón:

<Button
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/submit" />

Sintaxis

Esta es la sintaxis que necesitas para hacer referencia a un recurso en un recurso XML:

@[<package_name>:]<resource_type>/<resource_name>
  • <package_name> es el nombre del paquete en el que se ubica el recurso (no es necesario cuando se hace referencia a recursos desde el mismo paquete).
  • <resource_type> es la subclase R para el tipo de recurso.
  • <resource_name> es el nombre de archivo del recurso sin la extensión o el valor del atributo android:name en el elemento XML (para valores simples).

Consulta Tipos de recursos para obtener más información acerca de cada tipo de recurso y cómo hacer referencia a ellos.

Casos de uso

En algunos casos debes usar un recurso para un valor en XML (por ejemplo, para aplicar una imagen de elemento de diseño a un widget), pero también puedes usar un recurso en XML en cualquier lugar donde se acepte un valor simple. Por ejemplo, si tienes el siguiente archivo de recurso que incluye un recurso de color y un recurso de string:

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

Puedes usar estos recursos en el siguiente archivo de diseño para establecer el color del texto y la string de 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" />

En este caso no necesitas especificar el nombre del paquete en la referencia del recurso porque los recursos son de tu propio paquete. Para hacer referencia a un recurso del sistema, deberás incluir el nombre del paquete. Por ejemplo:

<?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="@android:color/secondary_text_dark"
    android:text="@string/hello" />

Nota: Puedes usar recursos de strings en todo momento para poder localizar tu aplicación a otros idiomas. Para obtener información acerca de cómo crear recursos alternativos (como strings localizadas), consulta Provisión de recursos alternativos. Para acceder a una guía completa acerca de cómo localizar tu aplicación a otros idiomas, consulta Localización.

Incluso puedes usar recursos en XML para crear alias. Por ejemplo, puedes crear un elemento de diseño que sea un alias para otro recurso de elemento de diseño:

<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/other_drawable" />

Esto suena redundante, pero puede ser muy útil cuando se usa un recurso alternativo. Lee más acerca de la Creación de recursos de alias.

Referencia a atributos de estilo

Un recurso de atributo de estilo te permite hacer referencia al valor de un atributo en el tema aplicado actualmente. Hacer referencia a un atributo de estilo te permite personalizar la apariencia de elementos de la IU al diseñarlos para que coincidan con variaciones estándar proporcionadas por el tema actual, en lugar de proporcionar un valor codificado de forma rígida. Hacer referencia a un atributo de estilo esencialmente significa "usar el estilo identificado por el atributo en el tema actual".

Para hacer referencia a un atributo de estilo, la sintaxis del nombre es prácticamente idéntica al formato de recurso normal, pero en lugar del símbolo de arroba (@) usa un signo de interrogación (?). La sección de tipo de recurso es opcional. Por ejemplo:

?[<package_name>:][<resource_type>/]<resource_name>

Así es como puedes hacer referencia a un atributo para establecer el color de texto de modo que coincida con el color de texto "primario" del tema del sistema:

<EditText id="text"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textColor="?android:textColorSecondary"
    android:text="@string/hello_world" />

Aquí, el atributo android:textColor especifica el nombre de un atributo de estilo en el tema actual. Android ahora usa el valor aplicado al atributo de estilo android:textColorSecondary como el valor para android:textColor en este widget. Debido a que la herramienta de recursos del sistema reconoce que se prevé un recurso de atributo en este contexto, no necesitas indicar explícitamente el tipo (que sería ?android:attr/textColorSecondary); puedes excluir el tipo attr.

Acceso a recursos de la plataforma

Android contiene una cantidad de recursos estándar, como estilos, temas y diseños. Para acceder a esos recursos, califica la referencia a tu recurso con el nombre de paquete android. Por ejemplo, Android proporciona un recurso de diseño que puedes usar para enumerar elementos en un ListAdapter:

setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, myarray));

En este ejemplo, simple_list_item_1 es un recurso de diseño definido por la plataforma para elementos en una ListView. Puedes usar esto en lugar de crear tu propio diseño para los elementos de la lista. Para obtener más información, consulta la guía para desarrolladores de Vista de lista.