Je veux accéder à une ressource comme une chaîne ou un dessinable par son nom et non par son id int.
Quelle méthode devrais-je utiliser pour cela?
Ce sera quelque chose comme:
R.drawable.resourcename
Assurez-vous de ne pas avoir l’espace de nom Android.R
importé, car cela peut confondre Eclipse (si c’est ce que vous utilisez).
Si cela ne fonctionne pas, vous pouvez toujours utiliser la méthode getResources
d'un contexte ...
Drawable resImg = this.context.getResources().getDrawable(R.drawable.resource);
Où this.context
est initialisé sous la forme d'une Activity
, Service
ou de toute autre sous-classe Context
.
Mettre à jour:
Si c'est le nom que vous voulez, la classe Resources
(renvoyée par getResources()
) a une méthode getResourceName(int)
et une getResourceTypeName(int)
?
Mise à jour 2 :
La classe Resources
a cette méthode:
public int getIdentifier (String name, String defType, String defPackage)
Ce qui retourne l'entier du nom de ressource spécifié, type & package.
Si j'ai bien compris, c'est ce que vous voulez
int drawableResourceId = this.getResources().getIdentifier("nameOfDrawable", "drawable", this.getPackageName());
Où "ceci" est une activité, écrite juste pour clarifier.
Si vous voulez une chaîne dans strings.xml ou un identifiant d'un élément de l'interface utilisateur, remplacez "drawable"
int resourceId = this.getResources().getIdentifier("nameOfResource", "id", this.getPackageName());
Je vous préviens, cette façon d’obtenir des identifiants est très lente, n’utilisez que si nécessaire.
Lien vers la documentation officielle: Resources.getIdentifier (Nom de la chaîne, String defType, String defPackage)
int resourceID =
this.getResources().getIdentifier("resource name", "resource type as mentioned in R.Java",this.getPackageName());
Un moyen simple d'obtenir l'ID de ressource d'une chaîne. Ici resourceName est le nom de la ressource ImageView dans un dossier pouvant être dessiné qui est également inclus dans un fichier 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);
Je vous suggère d'utiliser ma méthode pour obtenir un identifiant de ressource. C'est beaucoup plus efficace que d'utiliser la méthode getIdentidier (), qui est lente.
Voici le code:
/**
* @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;
}
Kotlin Version
via Extension Function
Pour trouver un identifiant de ressource par son nom Dans Kotlin, ajoutez le fragment ci-dessous dans un fichier 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
Maintenant, tous les identifiants de ressources sont accessibles partout où vous avez une référence de contexte en utilisant la méthode resIdByName
:
val drawableResId = context.resIdByName("ic_edit_black_24dp", "drawable")
val stringResId = context.resIdByName("title_home", "string")
.
.
.
en plus de la solution @lonkly
méthode:
/**
* 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());
}
}
J'ai trouvé cette classe très utile pour gérer les ressources. Il a des méthodes définies pour gérer les dimensions, les couleurs, les dessinables et les chaînes, comme celui-ci:
public static String getString(Context context, String stringId) {
int sid = getStringId(context, stringId);
if (sid > 0) {
return context.getResources().getString(sid);
} else {
return "";
}
}
// 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());