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

Respuestas:

149

Será algo como:

R.drawable.resourcename

Asegúrese de no Android.Rimportar el espacio de nombres, ya que puede confundir a Eclipse (si eso es lo que está usando).

Si eso no funciona, siempre puedes usar un getResourcesmétodo de contexto ...

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

Donde this.contextse inicializa como una Activity, Serviceo cualquier otra Contextsubclase.

Actualizar:

Si es el nombre que desea, la Resourcesclase (devuelta por getResources()) tiene un getResourceName(int)método y un getResourceTypeName(int)?

Actualización 2 :

La Resourcesclase tiene este método:

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

Que devuelve el entero del nombre de recurso, tipo y paquete especificados.

Rabioso
fuente
Thankq por su respuesta .R.drawable.resourcename que estoy usando ahora necesito obtener su valor entero pasando el nombre del recurso
Aswan
2
R.drawable.resourcename es el entero
Rabioso
Hola Rabid. Lo que dijiste que hay de alguna manera accediendo al valor de R.drawable .resource pasando recursos
Aswan
i necesito que valor entero pasando resourcename dinámicamente
Aswan
Gracias como esta quiero y quiero obtener una identificación de recursos dibujables. Cómo lo haré
Aswan
341

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 una Cadena en strings.xml o un identificador de un elemento de la IU, sustituya "dibujable"

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

Te advierto que esta forma de obtener identificadores es realmente lenta, úsala solo donde sea necesario.

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

Maragues
fuente
3
Esto es bastante útil en el contexto de escribir pruebas para asegurarse de que existen ciertas cadenas o etc.
Ehtesh Choudhury
1
No lo sé hombre, he agregado un registro antes y después de getIdentifier () con marca de tiempo y me mostró que se ejecuta en 0 - 1 ms. ¡Entonces no es lento, es súper rápido! Lo estoy usando para obtener imágenes de los recursos y funciona perfectamente. Probado en Nexus5x.
Kirill Karmazin
1
@KirillKarmazin: Nexus5X es un teléfono decentemente rápido, y 1ms para esa llamada es bastante lento. Recuerde que cada cuadro de la interfaz de usuario es de solo 16 ms.
Mooing Duck
Wikipedia dice que Kotlin apareció por primera vez en 2011, ¿cómo puede responder una pregunta al respecto en 2010
Abhinav Chauhan
25
int resourceID = 
    this.getResources().getIdentifier("resource name", "resource type as mentioned in R.java",this.getPackageName());
usuario1393422
fuente
15

Kotlin VersionvíaExtension Function

Para encontrar una identificación de recurso por su nombre En Kotlin, agregue el fragmento a continuación en un archivo kotlin:

ExtensionFunctions.kt

import android.content.Context
import android.content.res.Resources

fun Context.resIdByName(resIdName: String?, resType: String): Int {
    resIdName?.let {
        return resources.getIdentifier(it, resType, packageName)
    }
    throw Resources.NotFoundException()
}


Usage

Ahora se puede acceder a todos los identificadores de recursos siempre que tenga una referencia de contexto utilizando el resIdByNamemétodo:

val drawableResId = context.resIdByName("ic_edit_black_24dp", "drawable")
val stringResId = context.resIdByName("title_home", "string")
.
.
.    
aminografía
fuente
Dice la Wikipedia Kotlin apareció por primera vez en 2011, puede usted por favor dígame cómo esta pregunta se hizo en 2010, y fue declarado en 2019 para android, cómo se le preguntó pregunta androide Kotlin en 2010
Abhinav Chauhan
14

Una forma sencilla de obtener la identificación de recursos de una cadena. Aquí resourceName es el nombre del recurso ImageView en la 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);
Muhammad Adil
fuente
6

Te sugiero que uses mi método para obtener un 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, e.g R.drawable.<b>image</b>
 * @param с - class of resource, e.g 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;

}
Solitaria
fuente
No funcionará para todos los casos. Por ejemplo, si tiene <string name = "string.name"> contenido </string>, la clase R.string tendrá un campo string_name. Y su método no funcionará en este punto.
ddmytrenko
3
Además, su método no es rápido en realidad. Porque la serialización de clases Java nunca funciona rápido.
ddmytrenko
5
// image from res/drawable
    int resID = getResources().getIdentifier("my_image", 
            "drawable", getPackageName());
// view
    int resID = getResources().getIdentifier("my_resource", 
            "id", getPackageName());

// string
    int resID = getResources().getIdentifier("my_string", 
            "string", getPackageName());
Manthan Patel
fuente
0

He encontrado esta clase muy útil para manejar con recursos. Tiene algunos métodos definidos para tratar con dimens, colores, dibujos 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 "";
    }
}
Diego Malone
fuente
Dice la Wikipedia Kotlin apareció por primera vez en 2011, puede usted por favor dígame cómo esta pregunta se hizo en 2010, y fue declarado en 2019 para android, cómo se le preguntó pregunta androide Kotlin en 2010
Abhinav Chauhan
0

Además de la solución @lonkly

  1. ver reflexiones y accesibilidad de campo
  2. variables innecesarias

método:

/**
 * lookup a resource id by field name in static R.class 
 * 
 * @author - ceph3us
 * @param variableName - name of drawable, e.g R.drawable.<b>image</b>
 * @param с            - class of resource, e.g 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());
    }
}
ceph3us
fuente
Dice la Wikipedia Kotlin apareció por primera vez en 2011, puede usted por favor dígame cómo esta pregunta se hizo en 2010, y fue declarado en 2019 para android, cómo se le preguntó pregunta androide Kotlin en 2010
Abhinav Chauhan
0

En Kotlin lo siguiente funciona bien para mí:

val id = resources.getIdentifier("your_resource_name", "drawable", context?.getPackageName())

Si el recurso se coloca en la carpeta mipmap, puede usar el parámetro "mipmap" en lugar de "dibujable".

Jens van de Mötter
fuente