如何在android中按名称访问可绘制资源

时间:2013-05-04 01:53:58

标签: android drawable

在我的应用程序中,我需要在某些地方获取一些位图drawable,我不想保留引用R。所以我创建了一个类DrawableManager来管理drawables。

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

然后我希望在某个地方得到drawable(car.png放在res / drawables中):

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

但是正如您所看到的,我无法通过名称访问资源:

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

任何替代方案?

6 个答案:

答案 0 :(得分:136)

请注意,您的方法几乎总是错误的做事方式(最好将上下文传递给使用drawable的对象本身,而不是在某处保留静态Context。)

鉴于此,如果您想进行动态可绘制加载,可以使用getIdentifier

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

答案 1 :(得分:21)

你可以这样做.-

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"
    ....

答案 2 :(得分:6)

修改图片内容:

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

答案 3 :(得分:1)

使用Kotlin

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

我将其编写为扩展函数,因此可以在代码中的任何位置使用它。

注意:在Java中,已弃用context.getResources().getDrawable(resourceId);

注意:文件名,是不带扩展名的文件,例如前“ a.png” 的名称将为“ a”

答案 4 :(得分:0)

如果您需要int资源

 Resources resources = context.getResources();
 int resourceId = resources.getIdentifier("eskb048", "drawable",context.getPackageName());
 // return like: R.drawable.eskb048.png

如果需要可绘制 检查第一个答案是否正确

答案 5 :(得分:0)

您可以这样实现

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

在Imageview中设置 resourceId

imageView.setImageResource(resourceId);