Android vectorDrawables.useSupportLibrary = true is stopping app
Asked Answered
T

5

47

If I use vectorDrawables.useSupportLibrary = true in gradle then run the app it stopped unfortunately. If I remove vectorDrawables.useSupportLibrary = true the app works.

My gradle:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"
    defaultConfig {
        vectorDrawables.useSupportLibrary = true
        applicationId "com.helikanon.firstapp"
        minSdkVersion 15
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.1.0'
    compile 'com.android.support:design:25.1.0'
    compile 'com.jakewharton:butterknife:8.4.0'
    compile 'com.android.support:support-v4:25.1.0'
    testCompile 'junit:junit:4.12'
    annotationProcessor 'com.jakewharton:butterknife-compiler:8.4.0'
    compile 'uk.co.chrisjenx:calligraphy:2.2.0'
    compile 'com.google.android.gms:play-services-ads:10.0.1'
}

The errors :

E/AndroidRuntime: FATAL EXCEPTION: main
                  java.lang.RuntimeException: Unable to start activity ComponentInfo{com.helikanon.firstapp/com.helikanon.firstapp.activities.MainActivity}: android.view.InflateException: Binary XML file line #62: Error inflating class Button
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
                      at android.app.ActivityThread.access$600(ActivityThread.java:130)
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
                      at android.os.Handler.dispatchMessage(Handler.java:99)
                      at android.os.Looper.loop(Looper.java:137)
                      at android.app.ActivityThread.main(ActivityThread.java:4745)
                      at java.lang.reflect.Method.invokeNative(Native Method)
                      at java.lang.reflect.Method.invoke(Method.java:511)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
                      at dalvik.system.NativeStart.main(Native Method)
                   Caused by: android.view.InflateException: Binary XML file line #62: Error inflating class Button
                      at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
                      at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
.
.
.

The app is crashing when I use Api 16 and Api 19 but When I use Api 23 it works.

Torrie answered 31/12, 2016 at 11:15 Comment(6)
Take a look at this article - chris.banes.me/2016/02/25/appcompat-vector. I had this problem too.Byington
I did exactly in this article but still I'm getting errorTorrie
I thought you wanted to know the reason for the crash. Anyways, what is the gradle version you're using?Byington
Gradle version is 2.2.3Torrie
I need to add vectorDrawables.useSupportLibrary = true because of I use vector icons and the app must works well(for example drawable tint) for vector icons under API 21Torrie
You can still use vectorDrawables.useSupportLibrary = true, just use ImageButton stead of Button.Ekaterina
E
44

You cannot use Vector Drawables in any other views except ImageView in pre-lollipop.

Please see this SO Answer by google developer advocate.

For AppCompat users, we’ve decided to remove the functionality which let you use vector drawables from resources on pre-Lollipop devices due to issues found in the implementation in version 23.2.0/23.2.1 [ https://code.google.com/p/android/issues/detail?id=205236, https://code.google.com/p/android/issues/detail?id=204708 ]. Using app:srcCompat and setImageResource() continues to work.

If you want to use the Vector Drawables pre-lollipop, use can set it programatically by converting it into a drawable.

Drawable drawable;

if (android.os.Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {
     drawable = context.getResources().getDrawable(drawableResId, context.getTheme());
} else {
     drawable = VectorDrawableCompat.create(context.getResources(), drawableResId, context.getTheme());
}

button.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null);
Embank answered 31/12, 2016 at 11:58 Comment(1)
ContextCompat.getDrawable() doesn't support vector drawables, using AndroidX provided method does: AppCompatResources.getDrawable(context, R.drawable.image)Ekaterina
C
23

I was on one of practice projects trying to learn background tasks and services in Android. When I pulled their sample code then initially it wasn't compiling due to this error. So I added below tag in app's build.gradle file to get rid of compilation issue:

android {
    defaultConfig{
        vectorDrawables.useSupportLibrary = true
    }
}

Now, the moment I added this configuration then my app also started to crash in Microsoft Android Simulator exactly the way OP has described.

Since my current focus was to learn about background tasks so I wanted to get started with debugging my app. So, I removed above configuration setting again. In addition to that I also removed an attribute named android:fillColor in path tag of one of my drawable resources (or you can also replace the value @color/colorAccent with a hexadecimal code such as #FF000000). After removing(or changing with hexadecimal code) it, my initial compilation error didn't come:

<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="80dp"
    android:height="80dp"
    android:viewportWidth="24"
    android:viewportHeight="24">

    <path
        android:fillColor="@color/colorAccent"
        android:pathData="M16.01 7L16 3h-2v4h-4V3H8v4h-0.01C7 6.99 6 7.99 6 8.99v5.49L9.5
18v3h5v-3l3.5-3.51v-5.5c0-1-1-2-1.99-1.99z" />
    <path
        android:pathData="M0 0h24v24H0z" />
</vector>

After removal it looks like:

<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="80dp"
    android:height="80dp"
    android:viewportWidth="24"
    android:viewportHeight="24">

    <path
        android:pathData="M16.01 7L16 3h-2v4h-4V3H8v4h-0.01C7 6.99 6 7.99 6 8.99v5.49L9.5
18v3h5v-3l3.5-3.51v-5.5c0-1-1-2-1.99-1.99z" />
    <path
        android:pathData="M0 0h24v24H0z" />
</vector>

My MS Android emulator had Kitkat(4.4). My code was crashing as my app was trying to use vector drawables on a pre-lollipop version of Android as mentioned in Vipul's accepted answer.

Choong answered 30/8, 2018 at 5:57 Comment(0)
V
9

To use VectorDrawableCompat, you need to set:

android.defaultConfig.vectorDrawables.useSupportLibrary = true

To use VectorDrawableCompat, you need to make two modifications to your project. First, set android.defaultConfig.vectorDrawables.useSupportLibrary = true in your build.gradle file, and second, use app:srcCompat instead of android:src to refer to vector drawables.

  1. Go to your build.gradle(Module: app) and add following line to android block. It should look like that.

    android {
        compileSdkVersion 27
        defaultConfig {
            applicationId "..."
            minSdkVersion 15
            targetSdkVersion 27
            versionCode 1
            versionName "1.0"
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
            vectorDrawables.useSupportLibrary = true // <------
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            }
        }
    }
    
  2. Refer to the source as srcCompat to allow your application to use vector graphics.

    app:srcCompat="@drawable/plane"

Verduzco answered 1/3, 2019 at 11:50 Comment(1)
You don't need to specify android.defaultConfig. part again if it is nested in android { defaultConfig { } } blocks.Dele
B
6

If your minSdkVersion 21 or higher you don't need this.

Android 5.0 officially support vector drawables.

https://developer.android.com/guide/topics/graphics/vector-drawable-resources

update: As of StuStirling mentioned, below API24 (Android 7.0) you need this if you reference other resources within your vector file.

Update:

If your removed the vectorDrawables.useSupportLibrary = true analyze the APK for generated pngs from the vectors. If you find ex: xxxhdpi-v4 in the drawables put back the useSupportLibrary line. (I don't reference other drawables from the vectors)

Burnaby answered 21/5, 2020 at 10:10 Comment(1)
Not strictly true. To reference other resources from within your vector file on < 24, you need to add useSupportLibrary = trueEphebe
E
3

In your case the problem is that Button isn't subclass of ImageView.

ImageView or it's subclasses such as ImageButton and FloatingActionButton can use the new app:srcCompat attribute to reference vector drawables.

To support vector drawable and animated vector drawable you need to add:

android {
    defaultConfig {
         vectorDrawables.useSupportLibrary = true
    }

And use app:srcCompat

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

You can still use your Vector Drawable by programatically converting it into a drawable using this method provided by AndroidX:

val drawable = AppCompatResources.getDrawable(context, R.drawable.loading_indeterminate)

https://developer.android.com/guide/topics/graphics/vector-drawable-resources

https://medium.com/androiddevelopers/using-vector-assets-in-android-apps-4318fd662eb9

Ekaterina answered 4/5, 2020 at 1:39 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.