web-dev-qa-db-fra.com

Comment obtenir un identifiant de ressource avec un nom de ressource connu?

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?

144
Aswan

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

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.

124
Rabid

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)

303
Maragues
int resourceID = 
    this.getResources().getIdentifier("resource name", "resource type as mentioned in R.Java",this.getPackageName());
23
user1393422

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);
11
Muhammad Adil

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;

}
6
Lonkly

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

en plus de la solution @lonkly 

  1. voir les réflexions et l'accessibilité du terrain 
  2. variables inutiles

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

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 "";
    }
}
0
Diego Malone
// 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
Manthan Patel