web-dev-qa-db-fra.com

Android vectorDrawables.useSupportLibrary = true arrête l'application

Si j'utilise vectorDrawables.useSupportLibrary = true dans gradle, puis lancez l'application, elle s'est malheureusement arrêtée. Si je supprime vectorDrawables.useSupportLibrary = true l'application fonctionne.

Mon 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'
}

Les erreurs:

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)
.
.
.

L'application se bloque lorsque j'utilise Api 16 et Api 19, mais lorsque j'utilise Api 23, cela fonctionne.

22
Alexander

Vous ne pouvez pas utiliser Drawables vectoriels dans d'autres vues, sauf ImageView dans la pré-Lollipop.

Veuillez voir ceci SO Answer par Google Developer Advocate.

Pour les utilisateurs d'AppCompat, nous avons décidé de supprimer la fonctionnalité qui vous permet d'utiliser les éléments vectoriels à dessiner des ressources sur les appareils pré-Lollipop en raison de problèmes trouvés dans l'implémentation de la 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 ] . L'utilisation de app:srcCompat Et setImageResource() continue de fonctionner.

Si vous souhaitez utiliser la pré-sucette Vector Drawables , use peut la définir par programme en la convertissant en une 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);
30
Vipul Asri

J'étais sur l'un des projets d'entraînement essayant d'apprendre des tâches et des services d'arrière-plan dans Android. Lorsque j'ai extrait leur exemple de code, il ne se compilait pas initialement en raison d'une erreur this . J'ai donc ajouté la balise ci-dessous dans le fichier build.gradle de l'application pour se débarrasser du problème de compilation:

Android {
    defaultConfig{
        vectorDrawables.useSupportLibrary = true
    }
}

Maintenant, au moment où j'ai ajouté cette configuration, mon application a également commencé à planter dans Microsoft Android Simulator exactement comme OP l'a décrit.

Étant donné que mon objectif actuel était d'apprendre les tâches d'arrière-plan, je voulais donc commencer à déboguer mon application. J'ai donc supprimé à nouveau le paramètre de configuration ci-dessus. En plus de cela, j'ai également supprimé un attribut nommé Android:fillColor dans path tag d'une de mes ressources dessinables (ou vous pouvez également remplacer la valeur @color/colorAccent avec un code hexadécimal tel que #FF000000). Après l'avoir supprimé (ou modifié avec du code hexadécimal), mon erreur de compilation initiale ne s'est pas produite:

<?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>

Après le retrait, il ressemble à:

<?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>

Mon MS Android avait KitKat (4.4). Mon code se bloquait alors que mon application essayait d'utiliser des dessins vectoriels sur une version pré-Lollipop de Android as mentionné dans la réponse acceptée de Vipul.

6
RBT

Pour utiliser VectorDrawableCompat, vous devez définir Android.defaultConfig.vectorDrawables.useSupportLibrary = true.

Pour utiliser VectorDrawableCompat, vous devez apporter deux modifications à votre projet. Tout d'abord, définissez Android.defaultConfig.vectorDrawables.useSupportLibrary = true dans votre fichier build.gradle, et ensuite, utilisez app: srcCompat au lieu d'Android: src pour faire référence aux dessins vectoriels.

1) Accédez à votre build.gradle (Module: app) et ajoutez la ligne suivante au bloc Android. Cela devrait ressembler à ça.

Android {
    compileSdkVersion 27
    defaultConfig {
        applicationId "..."
        minSdkVersion 15
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "Android.support.test.runner.AndroidJUnitRunner"
------> Android.defaultConfig.vectorDrawables.useSupportLibrary = true
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-Android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

2) Reportez-vous à la source en tant que srcCompat pour permettre à votre application d'utiliser des graphiques vectoriels.

app: srcCompat = "@ drawable/plane"

3
Alexander