在build.gradle中使用android支持库23.2崩溃app(XmlPullParserException:XmlPullParserException:无效的drawable标签向量)

lis*_*oss 11 svg android custom-controls android-support-library

当使用支持库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'
Run Code Online (Sandbox Code Playgroud)

然而,当我使用更新版本(23.2)的android支持库构建它时,它会崩溃:

XmlPullParserException: Binary XML file line #17: invalid drawable tag vector

当应用想要使用简单的自定义视图来充气警报对话框时,会发生这种情况.自定义视图使用包含<shape>标记的XML文件作为其drawable之一.

<?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> 
Run Code Online (Sandbox Code Playgroud)

虽然我无法在崩溃日志中明确指出这个基于SVG的drawable,但我的猜测是因为Google引入了支持VectorDrawables,它与我的应用程序发生了某种程度的冲突.

任何有关如何查明罪魁祸首的提示或输入都表示赞赏.

the*_*ott 13

我遇到了类似的问题.我得到了同样的错误,因为我在设置ImageView的源代码时仍然使用android:src属性而不是app:srcCompat

在您引用矢量drawable的任何地方更改此属性都可以解决您的问题.

旧:

<ImageView
  android:layout_width="wrap_content"  
  android:layout_height="wrap_content"  
  android:src="@drawable/ic_add" />
Run Code Online (Sandbox Code Playgroud)

新:

<ImageView
  android:layout_width="wrap_content"  
  android:layout_height="wrap_content"  
  app:srcCompat="@drawable/ic_add" />
Run Code Online (Sandbox Code Playgroud)

  • app:srcCompat只能用于基于图像的视图,我使用的是基于Button的视图,根据博客文章,它不支持app:srcCompat (3认同)

lis*_*oss 3

事实证明有两个不同的问题:

  • RadioButton我在 XML 文件中使用了普通格式。更改它以android.support.v7.widget.AppCompatRadioButton解决问题。
  • 其次,正如博客文章建议的那样,我必须将一些可绘制对象包装到容器可绘制对象中,以便支持库在进行基于矢量的绘图时可以使用它们。例如,在我的一个自定义按钮中,我将基于矢量的背景保存在dialog_bg.xmlbutton_round_bg.xml和 中button_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>
Run Code Online (Sandbox Code Playgroud)

现在我会改变我的自定义按钮的背景说

<customButton
    android:background="@drawable/vector_wrapper"
</customButton>
Run Code Online (Sandbox Code Playgroud)

由于包装器现在具有三个可绘制对象,因此我可以根据需要在 Java 代码中选择它们:

customButton btnSave = (customButton) view.findViewById(R.id.btnSave);
btnSave.getBackground().setLevel(3);
Run Code Online (Sandbox Code Playgroud)

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