如何从资源创建Drawable

Posted

技术标签:

【中文标题】如何从资源创建Drawable【英文标题】:How to create Drawable from resource 【发布时间】:2011-06-16 15:06:50 【问题描述】:

我有一张图片 res/drawable/test.png (R.drawable.test)。 我想将此图像传递给接受Drawable 的函数,例如mButton.setCompoundDrawables().

那么如何将图像资源转换为Drawable

【问题讨论】:

【参考方案1】:

您的 Activity 应该具有 getResources 方法。做:

Drawable myIcon = getResources().getDrawable( R.drawable.icon );


从 API 版本 21 开始,此方法已弃用,可以替换为:

Drawable myIcon = AppCompatResources.getDrawable(context, R.drawable.icon);

如果您需要指定自定义主题,以下将应用它,但前提是 API 版本为 21 或更高版本:

Drawable myIcon =  ResourcesCompat.getDrawable(getResources(), R.drawable.icon, theme);

【讨论】:

如果您碰巧想要在 Activity 类之外使用它,您必须找到其他方法来到达 getResources() 所在的上下文; this answer recommends passing it into the constructor 从 API 版本 21 开始,此方法已被弃用,您应该替换为:Drawable drawable = ResourcesCompat.getDrawable(getResources(), page.getImageId(), null); @Boren 和使用 ContextCompat.getDrawable(this, R.drawable.icon); 一样吗? 如果 R.drawable.icon 是 Vector drawable,上述建议似乎都不起作用。 如果您使用矢量绘图,请不要使用它。请改用 AppCompatResources.getDrawable(context, R.drawable.icon)。【参考方案2】:

此代码已弃用:

Drawable drawable = getResources().getDrawable( R.drawable.icon );

改用这个:

Drawable drawable = ContextCompat.getDrawable(getApplicationContext(),R.drawable.icon);

【讨论】:

请注意,这将应用给定上下文中的主题。如果要确保不使用主题,可以使用ResourcesCompat.getDrawable(getResources(), R.drawable.icon, null);(其中第三个参数是可选的主题实例)。【参考方案3】:

getDrawable (int id) 方法自 API 22 起已弃用。

您应该将getDrawable (int id, Resources.Theme theme) 用于 API 21+

代码看起来像这样。

Drawable myDrawable;
if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP)
    myDrawable = context.getResources().getDrawable(id, context.getTheme());
 else 
    myDrawable = context.getResources().getDrawable(id);

【讨论】:

为什么不为每个 api 传递 null?另外:你确定 null 是最好的选择吗? getDrawable(int id, Resources.Theme 主题) 直到 API 21 才出现。 getResources().getDrawable(R.drawable.ic_warning_80dp, context?.theme)【参考方案4】:

我想补充一点,如果您在使用 getDrawable(...) 时收到“已弃用”消息,您应该使用支持库中的以下方法。

ContextCompat.getDrawable(getContext(),R.drawable.[name])

使用此方法时,您不必使用 getResources()。

这相当于做类似的事情

Drawable mDrawable;
if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP)
    mDrawable = ContextCompat.getDrawable(getContext(),R.drawable.[name]);
 else 
    mDrawable = getResources().getDrawable(R.id.[name]);

这适用于 Lollipop 前后版本。

【讨论】:

【参考方案5】:

无论是否为矢量,都从矢量资源中获取 Drawable:

AppCompatResources.getDrawable(context, R.drawable.icon);

注意:ContextCompat.getDrawable(context, R.drawable.icon); 将为矢量资源生成android.content.res.Resources$NotFoundException

【讨论】:

很好的答案!!【参考方案6】:

如果您试图从设置图像的视图中获取可绘制对象,

ivshowing.setBackgroundResource(R.drawable.one);

那么drawable将只返回空值,代码如下...

   Drawable drawable = (Drawable) ivshowing.getDrawable();

因此,如果您想从特定视图中检索可绘制对象,最好使用以下代码设置图像。

 ivshowing.setImageResource(R.drawable.one);

只有这样我们才能准确转换drawable。

【讨论】:

【参考方案7】:

如果你是从片段继承的,你可以这样做:

Drawable drawable = getActivity().getDrawable(R.drawable.icon)

【讨论】:

这对我有用,在 Android Studio 建议后它转换为 requireActivity()!!.getDrawable(R.drawable.id)【参考方案8】:

您必须通过兼容的方式获取它,不推荐使用其他方式:

Drawable drawable = ResourcesCompat.getDrawable(context.getResources(), R.drawable.my_drawable, null);

【讨论】:

以上是关于如何从资源创建Drawable的主要内容,如果未能解决你的问题,请参考以下文章

如何从现有资源创建模板?

如何从 aws cloudformation 模板为特定资源类型创建堆栈

如何从android资源colors.xml创建颜色枚举(int)

如何从excel创建本地化资源文件?在 UWP 中

如何通过忽略未使用的资源从 aws cli 创建 aws java lambda 函数?

创建和安装 grails 插件 - 在安装期间/安装后,我的插件如何从依赖的插件访问资源?