我有一张图片res/drawable/test.png
(R.drawable.test)
我想将此图像传递给接受Drawable
的函数
(例如mButton.setCompoundDrawables())
那么如何将图像资源转换为Drawable
?
答案 0 :(得分:537)
你的Activity应该有方法getResources。做:
Drawable myIcon = getResources().getDrawable( R.drawable.icon );
答案 1 :(得分:122)
不推荐使用此代码:
Drawable drawable = getResources().getDrawable( R.drawable.icon );
请改用:
Drawable drawable = ContextCompat.getDrawable(getApplicationContext(),R.drawable.icon);
答案 2 :(得分:22)
自API 22起,getDrawable (int id)
方法已弃用。
相反,您应该将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);
}
答案 3 :(得分:13)
我想补充一点,如果你得到了'#34;已弃用"使用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前后版本。
答案 4 :(得分:2)
如果您尝试从图像设置为的视图中获取可绘制,
ivshowing.setBackgroundResource(R.drawable.one);
然后drawable将仅使用以下代码返回null值...
Drawable drawable = (Drawable) ivshowing.getDrawable();
因此,如果您想从特定视图中检索可绘制的内容,最好使用以下代码设置图像。
ivshowing.setImageResource(R.drawable.one);
只有那时我们才能完全转换为drawable。
答案 5 :(得分:2)
从矢量资源获取Drawable,无论其是否为矢量:
AppCompatResources.getDrawable(context, R.drawable.icon);
注意:
ContextCompat.getDrawable(context, R.drawable.icon);
将为向量资源生成android.content.res.Resources$NotFoundException
。
答案 6 :(得分:0)
如果要从片段继承,则可以执行以下操作:
Drawable drawable = getActivity().getDrawable(R.drawable.icon)
答案 7 :(得分:0)
您必须通过兼容的方式来获取它,不建议使用其他人:
<Style x:Key="DefaultButtonBaseStyle" TargetType="{x:Type ButtonBase}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ButtonBase}">
<Grid>
<Border x:Name="BackBorder" Margin="0" Padding="0"
BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding BorderBrush}"/>
<Border x:Name="FrontBorder" BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}"
Margin="0" Padding="{TemplateBinding Padding}"
CornerRadius="{Binding ElementName=BackBorder, Path=CornerRadius}">
<ContentPresenter VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
</Border>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>