如何从资源创建Drawable


283

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

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

Answers:


566

您的活动应具有方法getResources。做:

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

2
如果您恰巧想要在Activity类之外使用它,则必须找到其他方法来到达getResources()所在的Context;此答案建议将其传递给构造函数
rymo 2014年

50
从API版本21开始,不推荐使用此方法,而应替换为:Drawable drawable = ResourcesCompat.getDrawable(getResources(),page.getImageId(),null);
2015年

3
@Boren和使用ContextCompat.getDrawable(this,R.drawable.icon);一样吗?
扎克

2
如果R.drawable.icon是Vector可绘制对象,则上述建议似乎都不起作用。
FractalBob

4
如果您使用的是可绘制矢量,请不要使用此功能。请改用AppCompatResources.getDrawable(context,R.drawable.icon)。
Dhaval Patel '18

136

此代码已弃用:

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

使用此代替:

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

11
请注意,这将应用给定上下文中的主题。如果要确保不使用任何主题,则可以使用ResourcesCompat.getDrawable(getResources(), R.drawable.icon, null);(其中第三个参数是可选的Theme实例)。
vaughandroid

23

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

相反,您应该使用getDrawable (int id, Resources.Theme theme)for 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是最佳选择吗?
jonathanrz

1
直到API 21才出现getDrawable(int id,Resources.Theme主题)
Chris Stillwell,2015年

getResources().getDrawable(R.drawable.ic_warning_80dp, context?.theme)
Simon Featherstone,

13

我只想补充一点,如果在使用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]);
}

这适用于之前和之后的棒棒糖版本。


4

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

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

注意:
ContextCompat.getDrawable(context, R.drawable.icon);将产生android.content.res.Resources$NotFoundException用于向量的资源。


3

如果您尝试从将图片设置为的视图中获取可绘制对象,

ivshowing.setBackgroundResource(R.drawable.one);

那么drawable将仅使用以下代码返回空值...

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

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

 ivshowing.setImageResource(R.drawable.one);

只有这样,drawable才能进行精确转换。


1

如果要从片段继承,则可以执行以下操作:

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

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.