¿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.


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)


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());

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")
.
.
.    

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);

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;

}

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());

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 "";
    }
}

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());
    }
}

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".

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.