Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

XmlPullParserException Binary XML file line #17<vector> tag requires viewportWidth > 0

Tags:

This is a follow up question to this question:

Update Android Support Library to 23.2.0 cause error: XmlPullParserException Binary XML file line #17<vector> tag requires viewportWidth > 0

I also updated the support library to 23.2 and started getting the error:

XmlPullParserException Binary XML file line #17<vector> tag requires viewportWidth > 0

That question solved it for Android Studio and Gradle. How can this be solved when using Eclipse without Gradle?

like image 501
Yonatan Nir Avatar asked Feb 26 '16 23:02

Yonatan Nir


4 Answers

You can either switch back to the previous version of the appcompat library (Quick fix):

compile 'com.android.support:appcompat-v7:23.1.1'

Or keep the current library version and make the appropriate update to your build gradle file as explained by google in version 23.2.0 release note.

//for Gradle Plugin 2.0+  
android {  
    defaultConfig {  
        vectorDrawables.useSupportLibrary = true  
    }  
}

If you are using Gradle 1.5 you’ll instead use

defaultConfig {
    generatedDensities = []
}

// This is handled for you by the 2.0+ Gradle Plugin
aaptOptions {
    additionalParameters "--no-version-vectors"
}

Don't forget to update your gradle build tool to version 1.5.0 at least or you couldn't use the new parameters like generatedDensities:

classpath 'com.android.tools.build:gradle:1.5.0'

More infos on why here

like image 50
Gomino Avatar answered Oct 20 '22 19:10

Gomino


A previous answer to this question had a solution for developers who use Gradle, but I don't use Gradle so I want to summarize his answer which helped several people and what I eventually did. I accepted my own answer and not his since like I said, I don't use Gradle so I did not use what he wrote.

I did several things for it to work in the end. Possible solutions are:

First for Gradle users:

1) Revert the support library to an older version, since this one has a bug.

2) use compile 'com.android.support:appcompat-v7:23.2.1' as the bug was fixed there.

3) for Gradle Plugin 2.0:

android {  
    defaultConfig {  
        vectorDrawables.useSupportLibrary = true  
    }  
}

Or you can use Grade Build Tools 1.5.0 (classpath 'com.android.tools.build:gradle:1.5.0')

defaultConfig {
    generatedDensities = []
}

// no need for this with Gradle 2.0

aaptOptions {
    additionalParameters "--no-version-vectors"
}

This is the part for non Gradle users:

1) Open SDK manager.

2) Uninstalled both "Android Wear X" (where X is ARM or Intel) from APIs 22 and 23.

3) I then still had a compilation error in one of the styles of the AppCompat library. I simply commented them out (I'll risk the very specific device not working if it uses that very specific style).

After that I cleaned the project and it just started to work.

like image 38
Yonatan Nir Avatar answered Oct 20 '22 21:10

Yonatan Nir


For new users only, this problem is fixed in:

compile 'com.android.support:appcompat-v7:23.2.1'

like image 21
Syed Arsalan Shah Avatar answered Oct 20 '22 21:10

Syed Arsalan Shah


Event after trying the already provided answers, the app was crashing on some devices (mainly Samsung). So along with that, I tried loading vector drawables like this

Drawable drawable = AppCompatDrawableManager.get().getDrawable(context, R.drawable.resource_id);

This AppCompatDrawableManager internally tries to fetch drawable with various methods:

Drawable getDrawable(@NonNull Context context, @DrawableRes int resId,
            boolean failIfNotKnown) {
        checkVectorDrawableSetup(context);

        Drawable drawable = loadDrawableFromDelegates(context, resId);
        if (drawable == null) {
            drawable = createDrawableIfNeeded(context, resId);
        }
        if (drawable == null) {
            drawable = ContextCompat.getDrawable(context, resId);
        }

        if (drawable != null) {
            // Tint it if needed
            drawable = tintDrawable(context, resId, failIfNotKnown, drawable);
        }
        if (drawable != null) {
            // See if we need to 'fix' the drawable
            DrawableUtils.fixDrawable(drawable);
        }
        return drawable;
    }

Thus it works on all android versions and all devices (hopefully).

Note: Don't try to use Picasso(2.5.2)'s or Glide(3.7.0)'s method to load vector drawables. Because they internally use deprecated getDrawable(@DrawableRes int id) method. Which will result in Resources.NotFoundException on some devices.

like image 20
Rohit Arya Avatar answered Oct 20 '22 20:10

Rohit Arya