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

Réponses:

149

Ce sera quelque chose comme:

R.drawable.resourcename

Assurez-vous que l' Android.Respace 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 getResourcesméthode d' un contexte ...

Drawable resImg = this.context.getResources().getDrawable(R.drawable.resource);

this.contextest initialisé comme une Activity, Serviceou toute autre Contextsous-classe.

Mettre à jour:

Si c'est le nom que vous voulez, la Resourcesclasse (retournée par getResources()) a une getResourceName(int)méthode, et un getResourceTypeName(int)?

Mise à jour 2 :

La Resourcesclasse 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

Enragé
la source
Merci pour votre réponse .R.drawable.resourcename que j'utilise maintenant, je dois obtenir sa valeur entière en passant resourcename
Assouan
2
R.drawable.resourcename est l'entier.
Enragé
Salut Rabid.ce que vous avez dit est-il possible en accédant à la valeur de R.drawable .resource en passant resouce
Assouan
J'ai besoin de cette valeur entière en passant le nom de ressource dynamiquement
Assouan
Thankq like this I want and I want to get drawable resource id. How I wil to it
Assouan
341

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)

Maragues
la source
3
C'est assez utile dans le contexte de l'écriture de tests pour s'assurer que certaines chaînes existent ou etc.
Ehtesh Choudhury
1
Je ne sais pas mec, j'ai ajouté un journal avant et après getIdentifier () avec horodatage et il m'a montré qu'il est exécuté en 0 - 1 ms! Donc ce n'est pas lent, c'est super rapide! Je l'utilise pour obtenir des images à partir de ressources et cela fonctionne parfaitement. Testé sur Nexus5x.
Kirill Karmazin
1
@KirillKarmazin: Nexus5X est un téléphone décemment rapide, et 1 ms pour un tel appel est assez lent. N'oubliez pas que chaque image de l'interface utilisateur ne dure que 16 ms.
Mooing Duck
wikipedia dit que kotlin est apparu pour la première fois en 2011, comment pouvez-vous répondre à une question à ce sujet en 2010
Abhinav Chauhan
25
int resourceID = 
    this.getResources().getIdentifier("resource name", "resource type as mentioned in R.java",this.getPackageName());
user1393422
la source
15

Kotlin VersionviaExtension 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 resIdByNameméthode:

val drawableResId = context.resIdByName("ic_edit_black_24dp", "drawable")
val stringResId = context.resIdByName("title_home", "string")
.
.
.    
aminographie
la source
wikipedia dit que kotlin est apparu pour la première fois en 2011, pouvez-vous s'il vous plaît me dire comment cette question a été posée en 2010, et qu'elle a été déclarée pour Android en 2019, comment est-il posé la question kotlin android en 2010
Abhinav Chauhan
14

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);
Muhammad Adil
la source
6

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;

}
Solitaire
la source
Cela 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 sur ce point.
ddmytrenko
3
De plus, votre méthode n'est pas rapide en fait. Parce que la sérialisation des classes Java ne fonctionne jamais rapidement.
ddmytrenko
5
// 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());
Manthan Patel
la source
0

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 "";
    }
}
Diego Malone
la source
wikipedia dit que kotlin est apparu pour la première fois en 2011, pouvez-vous s'il vous plaît me dire comment cette question a été posée en 2010, et elle a été déclarée pour Android en 2019, comment est-il posé la question kotlin android en 2010
Abhinav Chauhan
0

en plus de la solution @lonkly

  1. voir les réflexions et l'accessibilité sur le 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());
    }
}
ceph3us
la source
wikipedia dit que kotlin est apparu pour la première fois en 2011, pouvez-vous s'il vous plaît me dire comment cette question a été posée en 2010, et elle a été déclarée pour Android en 2019, comment est-il posé la question kotlin android en 2010
Abhinav Chauhan
0

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".

Jens van de Mötter
la source