如何从 android 包中的资源 ID 获取可绘制对象?

我需要得到一个可绘制的对象显示在一个图像按钮。有没有一种方法可以使用下面的代码(或类似的代码)从 android.R. 绘制对象中获取对象。包裹 * ?

例如,如果 draableId 是 android.R.draable.ic _ delete

mContext.getResources().getDrawable(drawableId)
176596 次浏览
Drawable d = getResources().getDrawable(android.R.drawable.ic_dialog_email);
ImageView image = (ImageView)findViewById(R.id.image);
image.setImageDrawable(d);

API 21开始,您应该使用 getDrawable(int, Theme)方法而不是 getDrawable(int),因为它允许您为给定的 screen density/theme获取与特定 resource ID相关联的 drawable对象。调用 deprecatedgetDrawable(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);
}

最好的办法是

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

OR 使用下面的代码来绘制左、上、右、底。

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

还有

现在不推荐使用 getResources().getDrawable()

截至 API 21,您还可以使用:

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

而不是 < code > ContextCompat.getDrawable (context,android.R.draable.ic _ Dialogue _ email)

不推荐使用 API 21‘ getDrawable (int id)’

所以现在你需要

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

但最好的办法是:

- 您应该创建一个通用的类来获得绘制和颜色,因为如果在将来有任何不建议,那么您就不需要在项目的任何地方进行更改。您只需在此方法中进行更改
import android.content.Context
import android.graphics.drawable.Drawable
import androidx.core.content.res.ResourcesCompat


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


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

使用以下方法:

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

为 Kotlin 程序员提供解决方案(来自 API 22)

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