如何从资源创建Drawable

时间:2011-01-27 15:14:30

标签: android drawable

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

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

8 个答案:

答案 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>