web-dev-qa-db-de.com

Android vectorDrawables.useSupportLibrary = true stoppt die App

Wenn ich in gradle vectorDrawables.useSupportLibrary = true verwende, dann stoppte die App leider. Wenn ich vectorDrawables.useSupportLibrary = true entferne, funktioniert die App.

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

Die Fehler :

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

Die App stürzt ab, wenn ich Api 16 und Api 19 verwende, aber wenn ich Api 23 verwende, funktioniert es.

22
Alexander

Sie können Vektorzeichnungen in keiner anderen Ansicht außer ImageView in Pre-Lollipop verwenden.

Bitte lesen Sie diese SO Answer von Google Developer Advocate.

Für AppCompat-Benutzer haben wir beschlossen, die Funktionalität zu entfernen, mit der Sie Vektorzeichen aus Ressourcen auf Geräten vor Lollipop verwenden können, da bei der Implementierung 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 ] . Die Verwendung von app:srcCompat Und setImageResource() funktioniert weiterhin.

Wenn Sie den Vector Drawables Pre-Lollipop verwenden möchten, können Sie ihn programmgesteuert festlegen, indem Sie ihn in einen Drawable konvertieren.

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

Ich war an einem Übungsprojekt beteiligt und habe versucht, Hintergrundaufgaben und -dienste in Android zu erlernen. Als ich den Beispielcode abgerufen habe, wurde er aufgrund von this -Fehlern anfangs nicht kompiliert. Deshalb habe ich das folgende Tag in die build.gradle-Datei der App eingefügt, um das Kompilierungsproblem zu beseitigen:

Android {
    defaultConfig{
        vectorDrawables.useSupportLibrary = true
    }
}

In dem Moment, in dem ich diese Konfiguration hinzufügte, stürzte auch meine App in Microsoft Android Simulator genau so ab, wie es OP beschrieben hat.

Da ich mich momentan auf Hintergrundaufgaben konzentrierte, wollte ich mit dem Debuggen meiner App beginnen. Also habe ich die obigen Konfigurationseinstellungen wieder entfernt. Außerdem habe ich ein Attribut mit dem Namen Android:fillColor Im Tag path einer meiner darstellbaren Ressourcen entfernt (oder Sie können den Wert @color/colorAccent Durch einen hexadezimalen Code wie z #FF000000). Nach dem Entfernen (oder Ändern mit hexadezimalem Code) ist mein anfänglicher Kompilierungsfehler nicht aufgetreten:

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

Nach dem Entfernen sieht es so aus:

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

Mein MS Android Emulator hatte KitKat (4.4). Mein Code stürzte ab, als meine App versuchte, Vektor-Drawables auf einer Vor-Lollipop-Version von Android= as zu verwenden Erwähnt in Vipuls akzeptierter Antwort.

6
RBT

Um VectorDrawableCompat verwenden zu können, müssen Sie Android.defaultConfig.vectorDrawables.useSupportLibrary = true. einstellen

Um VectorDrawableCompat zu verwenden, müssen Sie zwei Änderungen an Ihrem Projekt vornehmen. Stellen Sie zuerst Android.defaultConfig.vectorDrawables.useSupportLibrary = true in Ihrer build.gradle-Datei ein und verwenden Sie zweitens app: srcCompat anstelle von Android: src, um auf Vektorzeichnungen zu verweisen.

1) Gehen Sie zu Ihrem build.gradle (Modul: App) und fügen Sie die folgende Zeile zu Android Block. Es sollte so aussehen.

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) Geben Sie als Quelle srcCompat an, damit Ihre Anwendung Vektorgrafiken verwenden kann.

app: srcCompat = "@ drawable/plane"

3
Alexander