80

私のアプリケーションでは、参照を保持したくない場所にいくつかのビットマップ ドローアブルを取得する必要があります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.?
}

代替案はありますか?

4

6 に答える 6

179

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

そのため、動的なドローアブルの読み込みを行いたい場合は、getIdentifierを使用できます。

Resources resources = context.getResources();
final int resourceId = resources.getIdentifier(name, "drawable", 
   context.getPackageName());
return resources.getDrawable(resourceId);
于 2013-05-04T02:09:00.917 に答える
23

あなたはこのようなことをすることができます.-

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

そしてそれをManifest applicationタグにマッピングします

<application
    android:name=".YourApplication"
    ....
于 2013-05-04T02:12:37.470 に答える
9

画像コンテンツの変更:

    ImageView image = (ImageView)view.findViewById(R.id.imagenElement);
    int resourceImage = activity.getResources().getIdentifier(element.getImageName(), "drawable", activity.getPackageName());
    image.setImageResource(resourceImage);
于 2016-05-18T17:02:18.657 に答える