Quiero acceder a un recurso como una Cadena o un Drawable por su nombre y no por su id int.
¿Qué método usaría para esto?
fuente
Quiero acceder a un recurso como una Cadena o un Drawable por su nombre y no por su id int.
¿Qué método usaría para esto?
Será algo como:
R.drawable.resourcename
Asegúrese de no Android.R
importar 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 getResources
método de contexto ...
Drawable resImg = this.context.getResources().getDrawable(R.drawable.resource);
Donde this.context
se inicializa como una Activity
, Service
o cualquier otra Context
subclase.
Actualizar:
Si es el nombre que desea, la Resources
clase (devuelta por getResources()
) tiene un getResourceName(int)
método y un getResourceTypeName(int)
?
Actualización 2 :
La Resources
clase 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.
R.drawable.resourcename
es el entero
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)
int resourceID =
this.getResources().getIdentifier("resource name", "resource type as mentioned in R.java",this.getPackageName());
Kotlin Version
ví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 resIdByName
método:
val drawableResId = context.resIdByName("ic_edit_black_24dp", "drawable")
val stringResId = context.resIdByName("title_home", "string")
.
.
.
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);
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;
}
// 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());
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 "";
}
}
Además de la solución @lonkly
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());
}
}
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".