Imprimir

Para hacer uso de los recursos que se han incorporado a un proyecto Android, se debe hacer referencia al identificador que se crea de forma automática para cada recurso. Esos identificadores se encuentran en el archivo R.java que se genera dentro de la carpeta gen.

accesoRecursos01

Esta clase R se genera durante la compilación del proyecto. Contiene un identificador para cada recurso que se haya registrado en la carpeta res. Para cada tipo de recurso se crea una subclase (por ejemplo, R.drawable para los recursos drawable) y a cada recurso se le asigna un valor entero estático (static integer) que es el identificador (ID) que debes usar para acceder a cada recurso. Observa, por ejemplo, la declaración del identificador para el recurso de tipo string llamado hello_world.

{code class="brush:xml; highlight:[33]"}/* AUTO-GENERATED FILE.  DO NOT MODIFY.
*
* This class was automatically generated by the
* aapt tool from the resource data it found. It
* should not be modified by hand.
*/

package com.example.hola.mundo;

public final class R {
public static final class attr {
}
public static final class dimen {
public static final int padding_large=0x7f040002;
public static final int padding_medium=0x7f040001;
public static final int padding_small=0x7f040000;
}
public static final class drawable {
public static final int ic_action_search=0x7f020000;
public static final int ic_launcher=0x7f020001;
}
public static final class id {
public static final int menu_settings=0x7f080000;
}
public static final class layout {
public static final int activity_main=0x7f030000;
}
public static final class menu {
public static final int activity_main=0x7f070000;
}
public static final class string {
public static final int app_name=0x7f050000;
public static final int hello_world=0x7f050001;
public static final int menu_settings=0x7f050002;
public static final int title_activity_main=0x7f050003;
}
public static final class style {
public static final int AppTheme=0x7f060000;
}
}{/code}

Esos números que se generan de forma automática no deben ser utilizados en el código. En su lugar se hará referencia al nombre que se le ha asignado a cada recurso, lo cual debe hacerse de distinta manera si se hace desde un archivo XML o desde código Java:

Acceso a recursos desde XML

Cuando necesites hacer referencia a un recurso desde un archivo XML (layout, menú, otro archivo de recursos, etc), puedes usar el siguiente formato

@tipoRecurso/nombreRecurso

Por ejemplo, para hacer referencia a la cadena de texto denominada hello_world, debes usar: @string/hello_world

En el contenido del archivo XML del layout creado para el proyecto Hola Mundo puedes ver su uso para que se muestre el contenido de este recurso en pantalla:

{code class="brush:xml; highlight:7"}    <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:padding="@dimen/padding_medium"
android:text="@string/hello_world"
tools:context=".MainActivity" />{/code}

También desde la vista gráfica del layout puedes ver el uso que se ha hecho de ese mismo recurso:

accesoRecursos02

Acceso a recurso desde código Java

En cambio, si necesitas hacer referencia a un recursos desde el código Java, debes usar un formato diferente:

R.tipoRecurso.nombreRecurso

Puedes ver dos ejemplos en el archivo MainActivity.java que se crea automáticamente al generar el proyecto HolaMundo, donde puedes ver que se hace referencia a los recursos R.layout.activity_mainR.menu.activity_main como parámetros de distintos métodos setContentViewgetMenuInflater().inflate cuya función no debe preocuparte en este momento.

{code class="highlight:[12,17]"}package com.example.hola.mundo;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

public class MainActivity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}

}{/code}

Ten en cuenta que cualquier referencia a uno de los identificadores de recursos equivalen a su correspondiente valor numérico entero, por lo que al hacer uso del identificador no estamos haciendo referencia al contenido del recurso. Por ejemplo, este código no es correcto:

String mensaje = R.string.hello_world;

En el ejemplo anterior se está intentado asignar un valor de tipo int a una variable de tipo String.

En función del tipo de recurso, se debe usar algún método que permita obtener la información deseada. Para ello se dispone en la clase Context del método getResources() que retorna una instancia de los recursos (Resources) definidos en la aplicación (observa que para utilizar ese método no es necesario indicar el nombre de la clase, ya que la clase Context está implementada en el sistema Android). A partir del objeto Resources que retorna, puedes usar alguno de los métodos que ofrece, obteniendo así un determinado recurso con el tipo adecuado. Se dispone de métodos como getString, getDrawable, getLayout, etc. Observa que en la declaración de cualquiera de esos métodos se debe pasar por parámetro un valor de tipo int correspondiente al identificador del recurso:

public String getString (int id)

Por ejemplo, para obtener la cadena de texto correspondiente al recurso indicado anteriormente, debería usarse: 

{code}String mensaje = getResources().getString(R.string.hello_world);{/code}