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

369voto

Maragues Points 9461

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 un String dans strings.xml ou un identifiant d'un élément d'interface utilisateur, remplacez "drawable" par "drawable".

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)

3 votes

Ceci est très utile dans le contexte de l'écriture de tests pour s'assurer de l'existence de certaines chaînes de caractères, etc.

1 votes

Je ne sais pas mec, j'ai ajouté un Log avant et après getIdentifier() avec le timestamp 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 récupérer des images à partir de ressources et cela fonctionne parfaitement. Testé sur Nexus5x.

2 votes

@KirillKarmazin : Le Nexus5X est un téléphone décemment rapide, et 1ms pour un tel appel est assez lent. N'oubliez pas que chaque trame de l'interface utilisateur ne dure que 16 ms.

160voto

Rabid Points 1103

Ce sera quelque chose comme :

R.drawable.resourcename

Assurez-vous que vous n'avez pas le Android.R importé, car cela peut perturber Eclipse (si c'est ce que vous utilisez).

Si cela ne fonctionne pas, vous pouvez toujours utiliser la fonction getResources méthode ...

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

Donde this.context est initialisé comme un Activity , Service ou tout autre Context sous-classe.

Mise à jour :

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

Mise à jour 2 :

Le site Resources possède cette méthode :

public int getIdentifier (String name, String defType, String defPackage) 

Qui renvoie l'entier du nom de la ressource, du type et du paquet spécifiés.

0 votes

Merci pour votre réponse .R.drawable.resourcename que j'utilise maintenant j'ai besoin d'obtenir sa valeur entière en passant resourcename.

2 votes

R.drawable.resourcename es le nombre entier.

0 votes

Ce que vous avez dit, c'est qu'il y a un moyen d'accéder à la valeur de la ressource R.drawable.resource en passant la ressource.

26voto

user1393422 Points 111
int resourceID = 
    this.getResources().getIdentifier("resource name", "resource type as mentioned in R.java",this.getPackageName());

24voto

aminography Points 2053

- Kotlin Version via Extension Function

Pour trouver un identifiant de ressource par son nom en Kotlin, ajoutez le snippet ci-dessous dans un fichier kotlin :

Fonctions d'extension.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 resIdByName méthode :

val drawableResId = context.resIdByName("ic_edit_black_24dp", "drawable")
val stringResId = context.resIdByName("title_home", "string")
.
.
.

17voto

Muhammad Adil Points 437

Un moyen simple d'obtenir l'ID d'une ressource à partir d'une chaîne de caractères. Ici, resourceName est le nom de la ressource ImageView dans le dossier drawable 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);

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