Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using android support library 23.2 in build.gradle crashes app (XmlPullParserException: XmlPullParserException: invalid drawable tag vector)

The app is working just fine when using support library v23.1.1 plugin and run under 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'

however when I build it using newer version (23.2) of android support library it crashes:

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

This happens when the app wants to inflate an alert dialog with a simple custom view. The custom view uses an XML file containing a <shape> tag as one of its 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> 

Though I can't specifically pinpoint this SVG based drawable in the crash logs, but my guess is since Google introduced support for VectorDrawables, it somehow clashes with my app.

Any hint or input on how to pinpoint the culprit is appreciated.

like image 297
listboss Avatar asked Feb 25 '16 07:02

listboss


2 Answers

I ran into a similar issue. I was getting the same error because I was still using the android:src attribute instead of app:srcCompat when setting the source of my ImageView

Changing this attribute everywhere you're referencing a vector drawable will fix your issue.

Old:

<ImageView
  android:layout_width="wrap_content"  
  android:layout_height="wrap_content"  
  android:src="@drawable/ic_add" />

New:

<ImageView
  android:layout_width="wrap_content"  
  android:layout_height="wrap_content"  
  app:srcCompat="@drawable/ic_add" />
like image 199
themichaelscott Avatar answered Nov 18 '22 10:11

themichaelscott


It turned out there were two separate issues:

  • I was using a plain RadioButton in my XML files. Changing it to android.support.v7.widget.AppCompatRadioButton fixed the problem.
  • Second, as the blog post was suggesting I had to wrap some of the drawables into container drawables so the support library could use them when doing vector based drawing. For example, in one of my custom buttons, I had vector based background saved in dialog_bg.xml, button_round_bg.xml and button_round_bg_2.xml.

    To fix that I had to put them in one of the containers (such as State list, Inset or LevelList). This wrapper was saved to a filed called 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>

Now I would change my custom button's background to say

<customButton
    android:background="@drawable/vector_wrapper"
</customButton>

Since the wrapper now has three drawables, I can select them in the Java code according to my needs:

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

You do not need to the container wrapper if your view is Image-based view as the other answer by @themichaelscott is suggesting, in that case just change the src to app:srcCompat="@drawable/ic_add"

like image 3
listboss Avatar answered Nov 18 '22 09:11

listboss