在build.gradle中使用android support库23.2导致应用程序崩溃(XmlPullParserException:XmlPullParserException:无效的drawable标记向量)。

11

当使用支持库 v23.1.1 插件并在 Android 4.4.4 (API 19) 上运行时,该应用程序正常工作。

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支持库的新版本(23.2)构建它时,应用程序会崩溃:

XmlPullParserException:Binary XML file line#17:无效的可绘制标签向量

这发生在应用程序希望填充具有简单自定义视图的警报对话框时。自定义视图使用包含<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,它与我的应用程序发生了某种冲突。

如有任何提示或建议,敬请提出。


正如我所猜测的那样,旧版本的支持库可以创建 <shape> 可绘图形的 .png 文件,而这是完全可行的。但是新版本的支持库却创建了 svg 文件,并在其中包含了 vector 标签,某种程度上导致 API 19 无法处理它。我甚至尝试了他们建议的打开和关闭 png 创建功能 vectorDrawables.useSupportLibrary = true ,但这并没有帮助到我。 - listboss
请注意,这个新属性仅存在于Gradle插件的2.0版本中。如果您正在使用Gradle 1.5,则应使用以下代码:// Gradle Plugin 1.5
android {
defaultConfig {
generatedDensities = []
} // This is handled for you by the 2.0+ Gradle Plugin
aaptOptions {
additionalParameters "--no-version-vectors"
}
}http://android-developers.blogspot.ru/2016/02/android-support-library-232.html
- Pavel Biryukov
你把SVG文件放在哪个目录下了? - IgorGanapolsky
2个回答

13
我遇到了类似的问题。因为我在设置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" />

3
app:srcCompat 只能用于基于图像的视图,而我正在使用基于按钮的视图。根据博客文章,它不支持 app:srcCompat。 - listboss
"Attribute is missing the Android namespace prefix" 错误。 - jyomin
1
@theMichaelScott的答案也被证明适用于FloatingActionButton:<android.support.design.widget.FloatingActionButton app:srcCompat="@drawable/ic_gps_fixed_24dp" /> - RobLabs
节省了我的时间! :) - Vivek Solanki

3

事实证明,存在两个不同的问题:

  • 我在我的XML文件中使用了普通的RadioButton。将其更改为android.support.v7.widget.AppCompatRadioButton即可解决问题。
  • 其次,正如博客文章所建议的那样,我必须将一些可绘制对象包装成容器可绘制对象,以便支持库在进行基于矢量图的绘制时可以使用它们。例如,在我的一个自定义按钮中,我有一个名为dialog_bg.xmlbutton_round_bg.xmlbutton_round_bg_2.xml的矢量背景。

    为了解决这个问题,我需要将它们放在其中一个容器中(例如State listInsetLevelList)。这个包装器保存在一个名为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代码中选择它们:

customButton btnSave = (customButton) view.findViewById(R.id.btnSave);
btnSave.getBackground().setLevel(3);

如果您的视图是基于Image的视图,那么您不需要容器包装器,就像@themichaelscott所建议的其他答案一样,在这种情况下,只需将src更改为app:srcCompat="@drawable/ic_add"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接