当drawable资源是Vector Drawable时,如何通过TypedArray获取Drawable对象?

时间:2017-03-17 16:58:07

标签: android android-vectordrawable

我编写了一个带有自定义属性的自定义复合视图。其中一个自定义属性是drawable,我希望使用的文件是Vector Drawable。

val typedArray = context.obtainStyledAttributes(attrs, R.styleable.CustomView, 0, 0)
val iconDrawable = typedArray.getDrawable(R.styleable.CustomView_icon_drawable)

我不断收到XmlPullParserException:二进制XML文件行#1:无效的可绘制标记向量

为什么会这样?

2 个答案:

答案 0 :(得分:10)

支持库

Android 4.4(API 20)支持矢量绘图。因此,如果 build.gradle 文件中的最低API级别(minSdkVersion)设置为小于20,请确保使用支持库。

要启用支持库,请在应用级 build.gradle 中添加以下行:

android {
    defaultConfig {
        vectorDrawables.useSupportLibrary = true
    }
}


自定义属性定义

attrs.xml 中的属性定义为引用类型:

<declare-styleable name="CustomView">
    <attr name="icon_drawable" format="reference" />
</declare-styleable>


获取drawable

的实例

最后,为了能够在.xml布局文件中获取指定drawable的实例,获取可绘制的资源ID并使用支持类ContextCompat创建此Drawable的实例

final int drawableResId = typedArray.getResourceId(R.styleable.CustomView_icon_drawable, -1);
final Drawable drawable = ContextCompat.getDrawable(getContext(), drawableResId)

答案 1 :(得分:10)

解决。

我需要做以下事情:

val drawableResId = typedArray.getResourceId(R.styleable.CustomView_icon_drawable, -1);
val drawable = AppCompatResources.getDrawable(getContext(), drawableResId)

获得解决方案的归属pskinkcreck