Je veux accéder à une ressource comme une chaîne ou un dessinable par son nom et non par son identifiant int.
Quelle méthode utiliserais-je pour cela?
Je veux accéder à une ressource comme une chaîne ou un dessinable par son nom et non par son identifiant int.
Quelle méthode utiliserais-je pour cela?
Réponses:
Ce sera quelque chose comme:
R.drawable.resourcename
Assurez-vous que l' Android.R
espace de noms n'est pas importé car il peut confondre Eclipse (si c'est ce que vous utilisez).
Si cela ne fonctionne pas, vous pouvez toujours utiliser la getResources
méthode d' un contexte ...
Drawable resImg = this.context.getResources().getDrawable(R.drawable.resource);
Où this.context
est initialisé comme une Activity
, Service
ou toute autre Context
sous-classe.
Mettre à jour:
Si c'est le nom que vous voulez, la Resources
classe (retournée par getResources()
) a une getResourceName(int)
méthode, et un getResourceTypeName(int)
?
Mise à jour 2 :
La Resources
classe a cette méthode:
public int getIdentifier (String name, String defType, String defPackage)
Qui renvoie l'entier du nom, du type et du package de ressource spécifiés
R.drawable.resourcename
est l'entier.
Si j'ai bien compris, c'est ce que tu veux
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 d'interface utilisateur, remplacez "dessiné"
int resourceId = this.getResources().getIdentifier("nameOfResource", "id", this.getPackageName());
Je vous préviens, cette façon d'obtenir des identifiants est vraiment lente, à n'utiliser qu'en cas de besoin.
Lien vers la documentation officielle: 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
viaExtension Function
Pour trouver un identifiant de ressource par son nom Dans Kotlin, ajoutez ci-dessous l'extrait de code 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
Désormais, tous les identifiants de ressources sont accessibles partout où vous avez une référence de contexte à l'aide de la resIdByName
méthode:
val drawableResId = context.resIdByName("ic_edit_black_24dp", "drawable")
val stringResId = context.resIdByName("title_home", "string")
.
.
.
Un moyen simple d'obtenir l'ID de ressource à partir d'une chaîne. Ici, resourceName est le nom de la ressource ImageView dans le dossier dessinable qui est également inclus dans le 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 ID 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;
}
// 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());
J'ai trouvé cette classe très utile pour gérer les ressources. Il a des méthodes définies pour traiter les dimensions, les couleurs, les dessinables et les chaînes, comme celle-ci:
public static String getString(Context context, String stringId) {
int sid = getStringId(context, stringId);
if (sid > 0) {
return context.getResources().getString(sid);
} else {
return "";
}
}
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());
}
}
Dans Kotlin, ce qui suit fonctionne très bien pour moi:
val id = resources.getIdentifier("your_resource_name", "drawable", context?.getPackageName())
Si la ressource est placée dans le dossier mipmap, vous pouvez utiliser le paramètre "mipmap" au lieu de "drawable".