在 build.gradle 中使用 android 支持库 23.2 会使应用程序崩溃(XmlPullParserException:XmlPullParserException:无效的可绘制标签向量)
Using android support library 23.2 in build.gradle crashes app (XmlPullParserException: XmlPullParserException: invalid drawable tag vector)
在 Android 4.4.4 (API 19):
下使用支持库 v23.1.1 插件和 运行 时,该应用程序运行良好
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:design:23.1.1'
compile 'com.android.support:support-v4:23.1.1'
然而,当我使用 android 支持库的 newer version (23.2) 构建它时,它崩溃了:
XmlPullParserException: Binary XML file line #17: invalid drawable tag vector
当应用想要使用简单的自定义视图扩充警报对话框时,就会发生这种情况。自定义视图使用包含 <shape>
标记的 XML 文件作为其可绘制对象之一。
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
<solid
android:color="@android:color/white" >
</solid>
<corners
android:radius="5dp">
</corners>
<stroke android:width="1dp" android:color="@color/AppColor" />
</shape>
虽然我无法在崩溃日志中明确指出这个基于 SVG 的可绘制对象,但我的猜测是因为 Google 引入了对 VectorDrawables
的支持,它与我的应用程序有某种冲突。
感谢任何有关如何查明罪魁祸首的提示或意见。
我运行遇到了类似的问题。我遇到了同样的错误,因为在设置我的 ImageView
的源时我仍然使用 android:src 属性而不是 app:srcCompat
在您引用矢量可绘制对象的任何地方更改此属性将解决您的问题。
旧:
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_add" />
新:
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:srcCompat="@drawable/ic_add" />
原来有两个不同的问题:
- 我在 XML 文件中使用普通的
RadioButton
。将其更改为 android.support.v7.widget.AppCompatRadioButton
解决了问题。
其次,由于博客 post 建议我必须将一些可绘制对象包装到 container 可绘制对象中,以便支持库可以使用它们在进行基于矢量的绘图时。例如,在我的一个自定义按钮中,我将基于矢量的背景保存在 dialog_bg.xml
、button_round_bg.xml
和 button_round_bg_2.xml
.
中
为了解决这个问题,我不得不将它们放在其中一个容器中(例如 State list, Inset or LevelList)。此包装器已保存到名为 vector_wrapper.xlm
:
的文件中
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:drawable="@drawable/dialog_bg"
android:maxLevel="1"
android:minLevel="1" />
<item
android:drawable="@drawable/button_round_bg"
android:maxLevel="2"
android:minLevel="2" />
<item
android:drawable="@drawable/button_round_bg_2"
android:maxLevel="3"
android:minLevel="3" />
</level-list>
现在我要将自定义按钮的背景更改为
<customButton
android:background="@drawable/vector_wrapper"
</customButton>
由于包装器现在有三个可绘制对象,我可以根据需要在 Java 代码中 select 它们:
customButton btnSave = (customButton) view.findViewById(R.id.btnSave);
btnSave.getBackground().setLevel(3);
如果您的视图是基于 Image
的视图,则不需要容器包装器,因为 @themichaelscott 的 建议,在这种情况下,只需将 src 更改为 app:srcCompat="@drawable/ic_add"
在 Android 4.4.4 (API 19):
下使用支持库 v23.1.1 插件和 运行 时,该应用程序运行良好compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:design:23.1.1'
compile 'com.android.support:support-v4:23.1.1'
然而,当我使用 android 支持库的 newer version (23.2) 构建它时,它崩溃了:
XmlPullParserException: Binary XML file line #17: invalid drawable tag vector
当应用想要使用简单的自定义视图扩充警报对话框时,就会发生这种情况。自定义视图使用包含 <shape>
标记的 XML 文件作为其可绘制对象之一。
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
<solid
android:color="@android:color/white" >
</solid>
<corners
android:radius="5dp">
</corners>
<stroke android:width="1dp" android:color="@color/AppColor" />
</shape>
虽然我无法在崩溃日志中明确指出这个基于 SVG 的可绘制对象,但我的猜测是因为 Google 引入了对 VectorDrawables
的支持,它与我的应用程序有某种冲突。
感谢任何有关如何查明罪魁祸首的提示或意见。
我运行遇到了类似的问题。我遇到了同样的错误,因为在设置我的 ImageView
的源时我仍然使用 android:src 属性而不是 app:srcCompat在您引用矢量可绘制对象的任何地方更改此属性将解决您的问题。
旧:
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_add" />
新:
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:srcCompat="@drawable/ic_add" />
原来有两个不同的问题:
- 我在 XML 文件中使用普通的
RadioButton
。将其更改为android.support.v7.widget.AppCompatRadioButton
解决了问题。 其次,由于博客 post 建议我必须将一些可绘制对象包装到 container 可绘制对象中,以便支持库可以使用它们在进行基于矢量的绘图时。例如,在我的一个自定义按钮中,我将基于矢量的背景保存在
中dialog_bg.xml
、button_round_bg.xml
和button_round_bg_2.xml
.为了解决这个问题,我不得不将它们放在其中一个容器中(例如 State list, Inset or LevelList)。此包装器已保存到名为
vector_wrapper.xlm
: 的文件中
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:drawable="@drawable/dialog_bg"
android:maxLevel="1"
android:minLevel="1" />
<item
android:drawable="@drawable/button_round_bg"
android:maxLevel="2"
android:minLevel="2" />
<item
android:drawable="@drawable/button_round_bg_2"
android:maxLevel="3"
android:minLevel="3" />
</level-list>
现在我要将自定义按钮的背景更改为
<customButton
android:background="@drawable/vector_wrapper"
</customButton>
由于包装器现在有三个可绘制对象,我可以根据需要在 Java 代码中 select 它们:
customButton btnSave = (customButton) view.findViewById(R.id.btnSave);
btnSave.getBackground().setLevel(3);
如果您的视图是基于 Image
的视图,则不需要容器包装器,因为 @themichaelscott 的 app:srcCompat="@drawable/ic_add"