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?
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?
Respuestas:
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.
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 VersionvíaExtension FunctionPara 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()
}
UsageAhora 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")
.
.
.
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".