当drawable 资源是Vector Drawable 时,如何通过TypedArray 获取Drawable 对象?
How do you get a Drawable object via a TypedArray when the drawable resource is a Vector Drawable?
我写了一个带有自定义属性的自定义复合视图。自定义属性之一是可绘制对象,我希望使用的文件是矢量可绘制对象。
val typedArray = context.obtainStyledAttributes(attrs, R.styleable.CustomView, 0, 0)
val iconDrawable = typedArray.getDrawable(R.styleable.CustomView_icon_drawable)
我不断收到 XmlPullParserException: Binary XML file line #1: invalid drawable tag vector
这是为什么?
支持库
从 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>
获取可绘制实例
最后,为了能够在您的 .xml 布局文件中获取指定可绘制对象的实例,获取可绘制对象资源 ID 并使用支持 class ContextCompat
创建实例这个可绘制对象
final int drawableResId = typedArray.getResourceId(R.styleable.CustomView_icon_drawable, -1);
final Drawable drawable = ContextCompat.getDrawable(getContext(), drawableResId)
已解决。
我需要执行以下操作:
val drawableResId = typedArray.getResourceId(R.styleable.CustomView_icon_drawable, -1);
val drawable = AppCompatResources.getDrawable(getContext(), drawableResId)
我写了一个带有自定义属性的自定义复合视图。自定义属性之一是可绘制对象,我希望使用的文件是矢量可绘制对象。
val typedArray = context.obtainStyledAttributes(attrs, R.styleable.CustomView, 0, 0)
val iconDrawable = typedArray.getDrawable(R.styleable.CustomView_icon_drawable)
我不断收到 XmlPullParserException: Binary XML file line #1: invalid drawable tag vector
这是为什么?
支持库
从 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>
获取可绘制实例
最后,为了能够在您的 .xml 布局文件中获取指定可绘制对象的实例,获取可绘制对象资源 ID 并使用支持 class ContextCompat
创建实例这个可绘制对象
final int drawableResId = typedArray.getResourceId(R.styleable.CustomView_icon_drawable, -1);
final Drawable drawable = ContextCompat.getDrawable(getContext(), drawableResId)
已解决。
我需要执行以下操作:
val drawableResId = typedArray.getResourceId(R.styleable.CustomView_icon_drawable, -1);
val drawable = AppCompatResources.getDrawable(getContext(), drawableResId)