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

时间:2011-10-19 01:48:34

标签: android resources drawable android-context

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

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

mContext.getResources().getDrawable(drawableId)

6 个答案:

答案 0 :(得分:201)

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

答案 1 :(得分:97)

API 21 开始,您应该使用getDrawable(int, Theme)方法而不是getDrawable(int),因为它允许您获取与特定关联的drawable对象给定resource ID的{​​{1}}。调用screen density/theme deprecated方法相当于调用getDrawable(int)

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

getDrawable(int, null)

使用此方法相当于调用:

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

答案 2 :(得分:9)

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

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

而不是ContextCompat.getDrawable(context, android.R.drawable.ic_dialog_email)

答案 3 :(得分:2)

最好的方法是

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

这适用于Drawable左侧,类似于右侧等等。

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

getResources().getDrawable()现已弃用

答案 4 :(得分:1)

不推荐使用API​​ 21 getDrawable(int id)因此,现在您需要使用

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

答案 5 :(得分:1)

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

val res = context?.let { ContextCompat.getDrawable(it, R.id.any_resource }