202 votes

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

Je veux accéder à une ressource comme un String ou un Drawable par son nom et non par son id int.

Quelle méthode dois-je utiliser pour cela ?

2 votes

11voto

Manthan Patel Points 99
// 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());

7voto

Lonkly Points 732

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;

}

0 votes

Il ne fonctionnera pas dans tous les cas. Par exemple, si vous avez <string name="string.name">content</string>, la classe R.string aura un champ string_name. Et votre méthode ne fonctionnera pas dans ce cas.

3 votes

Votre méthode n'est pas rapide non plus. Parce que la sérialisation des classes Java ne fonctionne jamais rapidement.

3voto

En Kotlin, ce qui suit fonctionne 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".

1voto

ceph3us Points 4819

En complément 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());
    }
}

0voto

Diego Malone Points 36

J'ai trouvé cette classe très utile pour gérer les ressources. Il possède des méthodes définies pour gérer les dimensions, les couleurs, les éléments dessinables et les chaînes de caractères, 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 "";
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X