【问题标题】:Using android support library 23.2 in build.gradle crashes app (XmlPullParserException: XmlPullParserException: invalid drawable tag vector)在 build.gradle 中使用 android 支持库 23.2 崩溃应用程序(XmlPullParserException: XmlPullParserException: invalid drawable tag vector)
【发布时间】:2016-02-25 07:25:17
【问题描述】:

当使用支持库 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 支持库的 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 的支持后,它与我的应用程序发生了某种冲突。

感谢任何有关如何查明罪魁祸首的提示或意见。

【问题讨论】:

  • 因为我怀疑旧的支持库为 &lt;shape&gt; drawables 创建了 .png 文件,它工作正常,但新的支持库创建了 svg 具有 vector 标记的文件,API 19 无法处理它。我什至尝试按照他们的建议打开和关闭 png 创建 vectorDrawables.useSupportLibrary = true 但这没有帮助。
  • 你会注意到这个新属性只存在于 Gradle 插件的 2.0 版本中。如果您使用的是 Gradle 1.5,您将改为使用 // Gradle Plugin 1.5 android { defaultConfig { generatedDensities = [] } // 这是由 2.0+ Gradle 插件处理的 aaptOptions { additionalParameters "--no-version-vectors" } } android-developers.blogspot.ru/2016/02/…
  • 您将 SVG 放在哪个目录中?

标签: android svg custom-controls android-support-library


【解决方案1】:

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

【讨论】:

  • app:srcCompat 只能用于基于图像的视图,我使用的是基于按钮的视图,根据博客文章它不支持 app:srcCompat
  • 给出“属性缺少 Android 命名空间前缀”错误
  • 来自@theMichaelScott 的回答也被证明也适用于 FloatingActionButton
  • 节省了我的时间! :)
【解决方案2】:

原来有两个不同的问题:

  • 我在我的 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>

由于包装器现在有三个drawable,我可以根据需要在Java代码中选择它们:

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

如果您的视图是基于Image 的视图,则不需要容器包装器,因为@themichaelscott 建议使用other answer,在这种情况下只需将src 更改为app:srcCompat="@drawable/ic_add"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-17
    • 1970-01-01
    • 2016-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多