¿Cómo obtener una identificación de recurso con un nombre de recurso conocido?

Quiero acceder a un recurso como un String o un Drawable por su nombre y no su ID int.

¿Qué método usaría para esto?

Será algo así como:

R.drawable.resourcename

Asegúrate de no tener importado el espacio de nombres de Android.R ya que puede confundir a Eclipse (si eso es lo que estás usando).

Si eso no funciona, siempre puedes usar el método getResources de contexto …

 Drawable resImg = this.context.getResources().getDrawable(R.drawable.resource); 

Donde this.context se inicializa como una Activity , Service o cualquier otra subclase de Context .

Actualizar:

Si es el nombre que desea, la clase Resources (devuelta por getResources() ) tiene un getResourceName(int) y un getResourceTypeName(int) ?

Actualización 2 :

La clase Resources tiene este método:

 public int getIdentifier (String name, String defType, String defPackage) 

Lo cual devuelve el entero del nombre del recurso especificado, tipo y paquete.

Si entendí bien, esto es lo que quieres

 int drawableResourceId = this.getResources().getIdentifier("nameOfDrawable", "drawable", this.getPackageName()); 

Donde “esto” es una actividad, escrita solo para aclarar.

En caso de que desee un String en strings.xml o un identificador de un elemento UI, sustituya “drawable”

 int resourceId = this.getResources().getIdentifier("nameOfResource", "id", this.getPackageName()); 

Te advierto, esta forma de obtener identificadores es muy lenta, usa solo cuando sea necesario.

Enlace a la documentación oficial: Resources.getIdentifier (String name, String defType, String defPackage)

 int resourceID = this.getResources().getIdentifier("resource name", "resource type as mentioned in R.java",this.getPackageName()); 

Una forma simple de obtener ID de recurso de la cadena. Aquí resourceName es el nombre del recurso ImageView en una carpeta dibujable que también se incluye en el archivo XML.

 int resID = getResources().getIdentifier(resourceName, "id", getPackageName()); ImageView im = (ImageView) findViewById(resID); Context context = im.getContext(); int id = context.getResources().getIdentifier(resourceName, "drawable", context.getPackageName()); im.setImageResource(id); 

Sugeriría que uses mi método para obtener una ID de recurso. Es mucho más eficiente que usar el método getIdentidier (), que es lento.

Aquí está el código:

 /** * @author Lonkly * @param variableName - name of drawable, eg R.drawable.image * @param с - class of resource, eg R.drawable.class or R.raw.class * @return integer id of resource */ public static int getResId(String variableName, Class с) { Field field = null; int resId = 0; try { field = с.getField(variableName); try { resId = field.getInt(null); } catch (Exception e) { e.printStackTrace(); } } catch (Exception e) { e.printStackTrace(); } return resId; } 

He encontrado esta clase muy útil para manejar con recursos. Tiene algunos métodos definidos para tratar con dimens, colores, drawables y cadenas, como este:

 public static String getString(Context context, String stringId) { int sid = getStringId(context, stringId); if (sid > 0) { return context.getResources().getString(sid); } else { return ""; } } 

además de la solución @lonkly

  1. ver reflexiones y accesibilidad en el campo
  2. variables innecesarias

método:

 /** * lookup a resource id by field name in static R.class * * @author - ceph3us * @param variableName - name of drawable, eg R.drawable.image * @param с - class of resource, eg R.drawable.class or R.raw.class * @return integer id of resource */ public static int getResId(String variableName, Class с) throws android.content.res.Resources.NotFoundException { try { // lookup field in class java.lang.reflect.Field field = с.getField(variableName); // always set access when using reflections // preventing IllegalAccessException field.setAccessible(true); // we can use here also Field.get() and do a cast // receiver reference is null as it's static field return field.getInt(null); } catch (Exception e) { // rethrow as not found ex throw new Resources.NotFoundException(e.getMessage()); } }