如何从Android包中的资源ID获取Drawable对象?


156

我需要获取一个Drawable对象以显示在图像按钮上。有没有办法使用下面的代码(或类似的代码)从android.R.drawable。*包中获取对象?

例如,如果drawableId是android.R.drawable.ic_delete

mContext.getResources().getDrawable(drawableId)

Answers:


222
Drawable d = getResources().getDrawable(android.R.drawable.ic_dialog_email);
ImageView image = (ImageView)findViewById(R.id.image);
image.setImageDrawable(d);

我还发现使用应用程序上下文似乎可以工作,谢谢。
布拉斯科维奇

20
自API 22起getDrawable(int id)不推荐使用。使用getDrawable(int id, Resources.Theme theme)代替。该方法getTheme()应该会有所帮助。
艾萨克·扎伊斯

1
我有一个小疑问。在这段代码中“不推荐使用Resources类型的getDrawable(int)方法”。根据一个SO答案1.在Java中使用不推荐使用的方法或类是否错误?从不赞成使用的定义开始:“用@Deprecated表示的程序元素是不鼓励程序员使用的元素,通常是因为这样做很危险,或者因为存在更好的替代方法。” 有什么更好的替代方法。
杀手(Killer)

107

API 21开始,应该使用getDrawable(int, Theme)方法代替getDrawable(int),因为它允许您获取drawableresource ID给定对象的特定对象关联的对象screen density/theme。调用该deprecated getDrawable(int)方法等同于调用getDrawable(int, null)

您应该改用支持库中的以下代码:

ContextCompat.getDrawable(context, android.R.drawable.ic_dialog_email)

使用此方法等效于调用:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    return resources.getDrawable(id, context.getTheme());
} else {
    return resources.getDrawable(id);
}

context.getDrawable(id);似乎等同于resources.getDrawable(id, context.getTheme());
ErickBergmann

如果您有支持库,则可以在一行中完成:ResourcesCompat.getDrawable(resources, id, context.getTheme());
k2col

9

从API 21开始,您还可以使用:

   ResourcesCompat.getDrawable(getResources(), R.drawable.name, null);

代替 ContextCompat.getDrawable(context, android.R.drawable.ic_dialog_email)


2
您能否提供选择的进一步说明
-Nyandika,

3

最好的方法是

 button.setBackgroundResource(android.R.drawable.ic_delete);

为Drawable左边使用此选项,为右边使用类似内容等。

int imgResource = R.drawable.left_img;
button.setCompoundDrawablesWithIntrinsicBounds(imgResource, 0, 0, 0);

getResources().getDrawable() 现在已弃用


0

getDrawable(int id)不推荐使用API 21 。 所以现在您需要使用

ResourcesCompat.getDrawable(context.getResources(), R.drawable.img_user, null)

但是最好的方法是:您应该创建一个通用类来获取可绘制的颜色,因为如果将来发生任何更改或弃用的东西,则无需在项目中的任何地方进行更改。只需更改此方法

object ResourceUtils {
    fun getColor(context: Context, color: Int): Int {
        return ResourcesCompat.getColor(context.getResources(), color, null)
    }

    fun getDrawable(context: Context, drawable: Int): Drawable? {
        return ResourcesCompat.getDrawable(context.getResources(), drawable, null)
    }
}

使用这样的方法:

Drawable img=ResourceUtils.getDrawable(context, R.drawable.img_user)
image.setImageDrawable(img);

0

遵循针对Kotlin程序员的解决方案(来自API 22)

val res = context?.let { ContextCompat.getDrawable(it, R.id.any_resource }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.