88 votes

comment accéder aux ressources dessinables par leur nom dans Android

Dans mon application, j'ai besoin de récupérer des images bitmap à un endroit où je ne veux pas conserver la référence. R . Je crée donc une classe DrawableManager pour gérer les objets à dessiner.

public class DrawableManager {
    private static Context context = null;

    public static void init(Context c) {
        context = c;
    }

    public static Drawable getDrawable(String name) {
        return R.drawable.?
    }
}

Ensuite, je veux récupérer le dessin par son nom quelque part comme ceci (le fichier car.png est placé dans le répertoire res/drawables) :

Drawable d= DrawableManager.getDrawable("car.png");

Cependant, comme vous pouvez le voir, je ne peux pas accéder aux ressources par le nom :

public static Drawable getDrawable(String name) {
    return R.drawable.?
}

Y a-t-il d'autres solutions ?

191voto

ianhanniballake Points 18370

Notez que votre approche est presque toujours la mauvaise (il vaut mieux passer le contexte dans l'objet lui-même qui utilise le dessinable plutôt que de conserver un élément statique de type Context quelque part).

Ainsi, si vous souhaitez charger des objets dessinés de manière dynamique, vous pouvez utiliser la fonction getIdentifier :

Resources resources = context.getResources();
final int resourceId = resources.getIdentifier(name, "drawable", 
   context.getPackageName());
return resources.getDrawable(resourceId);

23voto

ssantos Points 7484

Vous pourriez faire quelque chose comme ça.

public static Drawable getDrawable(String name) {
    Context context = YourApplication.getContext();
    int resourceId = context.getResources().getIdentifier(name, "drawable", YourApplication.getContext().getPackageName());
    return context.getResources().getDrawable(resourceId);
}

Afin d'accéder au contexte depuis n'importe quel endroit, vous pouvez étendre la classe Application.-

public class YourApplication extends Application {

    private static YourApplication instance;

    public YourApplication() {
        instance = this;
    }

    public static Context getContext() {
        return instance;
    }
}

Et le cartographier dans votre Manifest application étiquette

<application
    android:name=".YourApplication"
    ....

9voto

Raul Points 91

Modifier le contenu de l'image :

    ImageView image = (ImageView)view.findViewById(R.id.imagenElement);
    int resourceImage = activity.getResources().getIdentifier(element.getImageName(), "drawable", activity.getPackageName());
    image.setImageResource(resourceImage);

8voto

Mahmoud Mabrok Points 845

Utiliser Kotlin

fun Context.getResource(name:String): Drawable? {
    val resID = this.resources.getIdentifier(name , "drawable", this.packageName)
    return ActivityCompat.getDrawable(this,resID)
}

Je l'ai écrite en tant que fonction d'extension afin qu'elle puisse être utilisée à n'importe quel endroit du code.

Nota: context.getResources().getDrawable(resourceId); es obsolète en Java.

Nota : nom du fichier, c'est le nom sans les extensions, par exemple "a.png Le nom sera "a" .

3voto

Manas Points 21

Voici ce que vous pouvez faire

int resourceId = getResources().getIdentifier("your_drawable_name", "drawable", getPackageName());

Set (jeu de mots) identifiant de la ressource (resourceId) Dans Imageview

imageView.setImageResource(resourceId);

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