web-dev-qa-db-fra.com

Android, obtenir l'ID de ressource d'une chaîne?

Je dois passer un ID de ressource à une méthode dans l'une de mes classes. Il doit utiliser à la fois l'id sur lequel pointe la référence et également la chaîne. Comment devrais-je le mieux y parvenir?

Par exemple:

R.drawable.icon

J'ai besoin de l'ID entier, mais j'ai aussi besoin d'accéder à la chaîne "icon".

Il serait préférable que tout ce que je passe à la méthode soit la chaîne "icon".

130
Hamid

@EboMike: Je ne savais pas que Resources.getIdentifier() existait.

Dans mes projets, j'ai utilisé le code suivant pour le faire:

public static int getResId(String resName, Class<?> c) {

    try {
        Field idField = c.getDeclaredField(resName);
        return idField.getInt(idField);
    } catch (Exception e) {
        e.printStackTrace();
        return -1;
    } 
}

Il serait utilisé comme ceci pour obtenir la valeur de R.drawable.icon valeur entière de ressource 

int resID = getResId("icon", R.drawable.class); // or other resource class

Je viens de trouver un billet de blog disant que Resources.getIdentifier() est plus lent que d'utiliser la réflexion comme je le faisais. Vérifiez-le .

141
Macarse

Vous pouvez utiliser cette fonction pour obtenir l'ID de la ressource.

public static int getResourceId(String pVariableName, String pResourcename, String pPackageName) 
{
    try {
        return getResources().getIdentifier(pVariableName, pResourcename, pPackageName);
    } catch (Exception e) {
        e.printStackTrace();
        return -1;
    } 
}

Donc, si vous voulez obtenir pour drawable call function comme ceci

getResourceId("myIcon", "drawable", getPackageName());

et pour chaîne, vous pouvez l'appeler comme ça

getResourceId("myAppName", "string", getPackageName());

Lis ça

66
Azhar

Ceci est basé sur la réponse @Macarse.

Utilisez-le pour obtenir l'identifiant de ressources plus rapidement et plus facilement.

public static int getId(String resourceName, Class<?> c) {
    try {
        Field idField = c.getDeclaredField(resourceName);
        return idField.getInt(idField);
    } catch (Exception e) {
        throw new RuntimeException("No resource ID found for: "
                + resourceName + " / " + c, e);
    }
}

Exemple:

getId("icon", R.drawable.class);
36
Daniel De León

Comment obtenir un identifiant de ressource application à partir du nom de la ressource est une question assez courante et bien répondue.

Comment obtenir un natif Android l'id de la ressource à partir du nom de la ressource est moins bien répondu ... Voici ma solution pour obtenir une ressource pouvant être dessinée par Android par nom de ressource:

public static Drawable getAndroidDrawable(String pDrawableName){
    int resourceId=Resources.getSystem().getIdentifier(pDrawableName, "drawable", "Android");
    if(resourceId==0){
        return null;
    } else {
        return Resources.getSystem().getDrawable(resourceId);
    }
}

La méthode peut être modifiée pour accéder à d'autres types de ressources.

29
Martin Pearman

Si vous avez besoin de lier une chaîne et un int, pourquoi pas une carte?

static Map<String, Integer> icons = new HashMap<String, Integer>();

static {
    icons.add("icon1", R.drawable.icon);
    icons.add("icon2", R.drawable.othericon);
    icons.add("someicon", R.drawable.whatever);
}
11
Peter Knego

Vous pouvez utiliser Resources.getIdentifier(), bien que vous deviez utiliser le format de votre chaîne tel que vous l’utilisez dans vos fichiers XML, c.-à-d. package:drawable/icon.

9
EboMike

J'ai fait comme ça, ça marche pour moi:

    imageView.setImageResource(context.getResources().
         getIdentifier("drawable/Apple", null, context.getPackageName()));
5
Sarvar Nishonboev

Un moyen simple d'obtenir l'ID de ressource à partir de la 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);
4
Muhammad Adil

Puisque vous avez dit que vous ne vouliez transmettre qu'un paramètre et que cela ne semblait pas avoir d'importance, vous pouvez passer l'identificateur de ressource et rechercher ensuite le nom de la chaîne correspondant:

String name = getResources().getResourceEntryName(id);

C'est peut-être le moyen le plus efficace d'obtenir les deux valeurs. Vous n'avez pas à perdre à chercher juste la partie "icône" à partir d'une chaîne plus longue.

3
Steve Waring
public int getDrawableName(Context ctx,String str){
    return ctx.getResources().getIdentifier(str,"drawable",ctx.getPackageName());

}
2
Ivan Vovk

L'approche Kotlin

inline fun <reified T: Class<R.drawable>> T.getId(resourceName: String): Int {
            return try {
                val idField = getDeclaredField (resourceName)
                idField.getInt(idField)
            } catch (e:Exception) {
                e.printStackTrace()
                -1
            }
        }

Usage:

val resId = R.drawable::class.Java.getId("icon")
1
Arsenius

Dans MonoDroid/Xamarin.Android, vous pouvez effectuer les tâches suivantes:

 var resourceId = Resources.GetIdentifier("icon", "drawable", PackageName);

Mais comme GetIdentifier n’est pas recommandé dans Android, vous pouvez utiliser Reflection comme ceci:

 var resourceId = (int)typeof(Resource.Drawable).GetField("icon").GetValue(null);

où je suggère de mettre un essai/attraper ou vérifier les chaînes que vous passez.

1
Daniele D.

Dans votre res/layout/my_image_layout.xml

<LinearLayout ...>
    <ImageView
        Android:id="@+id/row_0_col_7"
      ...>
    </ImageView>
</LinearLayout>

Pour saisir cette ImageView par sa valeur @ + id, procédez comme suit dans votre code Java: 

String row = "0";
String column= "7";
String tileID = "row_" + (row) + "_col_" + (column);
ImageView image = (ImageView) activity.findViewById(activity.getResources()
                .getIdentifier(tileID, "id", activity.getPackageName()));

/*Bottom code changes that ImageView to a different image. "blank" (R.mipmap.blank) is the name of an image I have in my drawable folder. */
image.setImageResource(R.mipmap.blank);  
0
Gene

Pour obtenir un identifiant Drawable à partir du nom de ressource String, j'utilise ce code:

private int getResId(String resName) {
    int defId = -1;
    try {
        Field f = R.drawable.class.getDeclaredField(resName);
        Field def = R.drawable.class.getDeclaredField("transparent_flag");
        defId = def.getInt(null);
        return f.getInt(null);
    } catch (NoSuchFieldException | IllegalAccessException e) {
        return defId;
    }
}
0
bitvale