web-dev-qa-db-ja.com

androidの名前で描画可能リソースにアクセスする方法

私のアプリケーションでは、参照Rを保持したくない場所にビットマップドロウアブルを取得する必要があります。そこで、ドローアブルを管理するクラスDrawableManagerを作成します。

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.?
    }
}

次に、このような名前でドロアブルを取得します(car.pngはres/drawables内に配置されます):

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

ただし、ご覧のとおり、名前でリソースにアクセスすることはできません。

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

代替案はありますか?

63
hguser

あなたのアプローチは、ほとんど常に物事を行う間違った方法であることに注意してください(静的Contextをどこかに保持するよりも、ドロウアブルを使用しているオブジェクト自体にコンテキストを渡す方が良いです)。

したがって、動的な描画可能ロードを実行する場合は、 getIdentifier を使用できます。

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

このようなことができます。

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

どこからでもコンテキストにアクセスするために、Applicationクラスを拡張できます。

public class YourApplication extends Application {

    private static YourApplication instance;

    public YourApplication() {
        instance = this;
    }

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

Manifestapplicationタグにマップします

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

画像コンテンツの変更:

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