web-dev-qa-db-fra.com

comment accéder aux ressources pouvant être extraites par nom dans android

Dans mon application, je dois obtenir des dessins bitmap quelque part où je ne veux pas conserver la référence R. Je crée donc une classe DrawableManager pour gérer les dessinables.

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 obtenir le nom dessinable quelque part comme ceci (le fichier car.png est placé dans les ressources res/drawables):

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

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

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

Des alternatives?

63
hguser

Notez que votre approche est presque toujours la mauvaise façon de faire les choses (il est préférable de passer le contexte à l'objet lui-même qui utilise l'élément dessinable plutôt que de conserver un Context statique quelque part).

Etant donné que si vous voulez effectuer un chargement dynamique, vous pouvez utiliser getIdentifier :

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

Vous pourriez faire quelque chose comme ceci.-

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);
}

Pour accéder au contexte de n’importe où, vous pouvez étendre la classe d’application.

public class YourApplication extends Application {

    private static YourApplication instance;

    public YourApplication() {
        instance = this;
    }

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

Et mappez-le dans votre balise Manifestapplication

<application
    Android:name=".YourApplication"
    ....
22
ssantos

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);
6
Raul