it-swarm.com.de

Verwendung des Android-Vektors Drawables beim Absturz vor dem Lutscher

Ich verwende Vektor-Zeichensätze in Android vor Lollipop, und dies sind einige meiner Bibliotheken und Werkzeugversionen:

  • Android Studio: 2.0 
  • Android Gradle Plugin: 2.0.0 
  • Build-Tools: 23.0.2 
  • Android Support Library: 23.3.0

Ich habe diese Eigenschaft auf meiner App-Ebene hinzugefügt. Build.Gradle

Android {  
  defaultConfig {  
    vectorDrawables.useSupportLibrary = true  
   }  
}

Erwähnenswert ist auch, dass ich ein zusätzliches Zeichenelement wie LayerDrawable (layer_list) wie im offiziellen offiziellen Android-Blog ( link here ) angegeben zum Zeichnen von Zeichenobjekten für Vektorzeichenobjekte außerhalb von app:srcCompat

<level-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:drawable="@drawable/search"/>
</level-list>

Sie können Vektorzeichen außerhalb von .__ direkt referenzieren. app: srcCompat schlägt vor Lollipop fehl. AppCompat macht jedoch unterstützen das Laden von Vektor-Drawables, wenn sie in einem anderen .__ referenziert werden. Zeichenbarer Container wie StateListDrawable, InsetDrawable, LayerDrawable, LevelListDrawable und RotateDrawable. Mit diesem Indirection, können Sie Vektor-Zeichensätze verwenden, beispielsweise in TextView Android: drawableLeft-Attribut, das normalerweise nicht in der Lage ist Unterstützungsvektor drawables.

Wenn ich app:srcCompat benutze, funktioniert alles gut, aber wenn ich benutze:

Android:background
Android:drawableLeft
Android:drawableRight
Android:drawableTop
Android:drawableBottom

bei ImageView, ImageButton, TextView oder EditText vor Lollipop wird eine Erwartung ausgelöst: 

Caused by: Android.content.res.Resources$NotFoundException: File res/drawable/search_toggle.xml from drawable resource ID #0x7f0200a9
62

Ich denke, das passiert, weil Support Vector in der neuesten Bibliotheksversion: 23.3.0 deaktiviert war

Nach diesem POST :

Für AppCompat-Benutzer haben wir uns entschlossen, die Funktionalität zu entfernen, mit der Sie Vektor-Drawables aus Ressourcen auf Geräten vor Lollipop-Geräten verwenden können, da in Version 23.2.0/23.2.1 (AUSGABE 205236) Probleme aufgetreten sind. Die Verwendung von app: srcCompat und setImageResource () funktioniert weiterhin.

Wenn Sie die Ausgabe AUSGABE 205236 besuchen, werden sie in der Zukunft aktiviert. Das Problem mit dem Speicher wird jedoch nicht bald behoben:

In der nächsten Version habe ich eine Opt-In-API hinzugefügt, mit der Sie die VectorDrawable-Unterstützung wieder aktivieren können, die entfernt wurde. Es gibt jedoch die gleichen Einschränkungen wie zuvor (Speicherauslastung und Probleme bei der Konfigurationsaktualisierung).

Ich hatte ein ähnliches Problem. In meinem Fall habe ich also alle Icons, die von der Ressource gezeichnete Vektoren verwenden, wieder auf PNG-Bilder zurückgesetzt (da das Speicherproblem weiterhin auftritt, auch wenn sie eine Option zum erneuten Aktivieren bieten).

Ich bin nicht sicher, ob dies die beste Option ist, behebt jedoch meiner Meinung nach alle Abstürze.

UPDATE

Sie haben das VectorDrawable in wieder aktiviert
Android Support Library 23.4.0

Für AppCompat-Benutzer haben wir eine opt-in - API hinzugefügt, um die Unterstützung von Vector Drawables aus Ressourcen (Verhalten in 23.2) über AppCompatDelegate.setCompatVectorFromResourcesEnabled (true) wieder zu aktivieren. Beachten Sie dies kann weiterhin Probleme mit der Speichernutzung und beim Aktualisieren von Konfigurationsinstanzen verursachen, weshalb sie standardmäßig deaktiviert ist.

Vielleicht ist die Einstellung, build.gradle jetzt veraltet und Sie müssen sie nur in den richtigen Aktivitäten aktivieren (müssen jedoch testen).

Um es zu aktivieren, müssen Sie Folgendes tun:

public class MainActivity extends AppCompatActivity {
    static {
        AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
    }

    ...
}
64
W0rmH0le

Ich hatte das gleiche Problem ... Aber als ich viel Forschung und Entwicklung durchführte, bekam ich die Antwort.

Für Imageview und ImageButton verwenden Sie app: srcCompat = "@ drawable /...." Und für andere Ansichten wie Button, Textview anstelle von" drawableLeft/right ... "im XML-Code :

button.setCompoundDrawablesWithIntrinsicBounds(AppCompatResources.getDrawable(mContext,R.drawable.ic_share_brown_18dp), null, null, null);

Und verwenden Sie "AppCompatResources", um das Zeichenobjekt zu erhalten.

49

Um auf die anderen sehr gute Antworten einzugehen, ist hier ein Diagramm das kann Ihnen helfen. Es ist gültig, wenn Sie eine Support Library von 23.4.0 bis mindestens 25.1.0 haben.

 VectorDrawable cheatsheet

47
David Ferrand

Die Antwort von Guillherme P ist ziemlich großartig. Nur um eine kleine Verbesserung zu erreichen, müssen Sie diese Zeile nicht in jeder Aktivität hinzufügen. Wenn Sie sie einmal in der Application-Klasse hinzugefügt haben, funktioniert sie ebenfalls. 

public class App extends Application {

static {
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}

HINWEIS: Sie müssen noch die Verwendung der Support-Bibliothek in Gradle aktiviert haben: 

Android {
  defaultConfig {
    vectorDrawables.useSupportLibrary = true
  }
}

Stellen Sie außerdem sicher, dass Sie eine Support-Bibliotheksversion größer als v23.4 verwenden, wenn Google die Unterstützung für Drawable Container für VectorDrawables wieder hinzugefügt hat ( Versionshinweise ).

Update

Und für Codeänderungen:

  1. Stellen Sie sicher, dass Sie an jedem Ort, der das app:srcCompat-Attribut akzeptiert, ein Update auf Android:src durchführen (das IDE warnt Sie, wenn es ungültig ist, wie für das <bitmap>-Tag).
  2. Für drawableLeft, drawableStart, drawableRight, drawableEnd-Attribute, die in TextView und ähnlichen Ansichten verwendet werden, müssen Sie sie jetzt programmgesteuert festlegen. Ein Beispiel für die Einstellung von drawableStart:

    Drawable drawable = AppCompatResources.getDrawable(
            getContext(),
            R.drawable.your_vector_drawable);
    
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        textView.setCompoundDrawablesRelativeWithIntrinsicBounds(drawable, null, null, null);
    }
    
33
Benny

Ich hatte das gleiche Problem. Und beheben Sie es durch Entfernen 

vectorDrawables.useSupportLibrary = true

Meine Zielversion ist 25 und die Support-Bibliothek ist

 compile 'com.Android.support:appcompat-v7:25.3.1'
11
Rajesh Nasit

VectorDrawables auf Pre-Lollipop sollte ohne Verwendung funktionieren

AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);

Wenn Sie VectorDrawables in ImageViews verwenden möchten, können Sie das Attribut srcCompat verwenden. Das funktioniert zwar, aber in Buttons oder TextViews ist es not nicht, daher müssen Sie Drawable in InsetDrawable oder LayerDrawable einschließen. Es gibt einen weiteren Trick, den ich entdeckt habe. Wenn Sie die Datenbindung verwenden, können Sie Folgendes tun:

Android:drawableLeft="@{@drawable/vector_ic_access_time_24px}"
Android:drawableStart="@{@drawable/vector_ic_access_time_24px}"

Das wird magisch funktionieren, ich habe nicht untersucht, was hinter den Kulissen passiert, aber ich denke, die TextView verwendet die getDrawable-Methode von AppCompatResources oder ähnlichem.

8
cesards

Viel Forschung und Entwicklung, endlich die Lösung für Abstürze bei Geräten vor Lollipop.

Für Imageview

  • verwenden Sie app: srcCompat anstelle von Android: src

Für TextView/EditText

  • Entfernen Sie drawableleft , drawableright .... und setzen Sie den Code aus zeichnendem Java-Code.

txtview.setCompoundDrawablesWithIntrinsicBounds (AppCompatResources.getDrawable (EventDetailSinglePage.this, R.drawable.ic_done_black_24_n), null, null, null);

Für Build.gradle

vectorDrawables.useSupportLibrary = true

5
Jatin Mandanka

Für alle, die ein Upgrade auf Android Gradle 3.0 oder höher durchführen, ist es nicht erforderlich, AppCompatDelegate.setCompatVectorFromResourcesEnabled(true) zu verwenden oder vectorDrawables.useSupportLibrary = true festzulegen (da dies zu Problemen führt) und app:srcCompat zu verwenden.

Nehmen Sie sich zwei Tage Zeit, um dies herauszufinden, und finden Sie keine verwandten Dokumente in den Google-Dokumenten ...

4
Geng Jiawen

Ich verwende VectorDrawables auf Pre-Lollipop-Geräten. So mache ich das: -

Schritt 1: Platziere dies in deinem App-Level.

Android {
  defaultConfig {
    vectorDrawables.useSupportLibrary = true
  }
}

Schritt 2:

Fügen Sie dies in Ihre Application-Klasse ein und vergessen Sie nicht, Ihre Application-Klasse in der Manifestdatei zu registrieren.

public class App extends Application {
    static {
        AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
    }
}

Schritt 3:

Holen Sie VectorDrawables mit,

imageView.setImageDrawable(ContextCompat.getDrawable(this, R.drawable.my_vector_drawable));
2
Parag Kadam

Nach der Verwendung des folgenden Codes.

Android {
  defaultConfig {
  vectorDrawables.useSupportLibrary = true  
                }
        }




public class App extends Application {
static {
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}}

dennoch gibt es ein Problem mit Vektorgrafiken für die folgenden Attribute

DrawableEnd, DrawableStart, DrawableTop, DrawableBottom, Hintergrund

In diesem Fall befolgen Sie bitte die nachstehenden Anweisungen. Verwenden Sie anstelle der direkten Referenzierung des Vektorbildes das Selector-Tag als Zwischenablage.

Beispiel:

ic_warranty_icon.xml

<vector xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:width="17dp"
Android:height="24dp"
Android:autoMirrored="true"
Android:viewportWidth="17"
Android:viewportHeight="24">

<path
    Android:fillColor="#fff"
    Android:pathData="M10.927,15.589l-1.549,0.355a7.47,7.47 0,0 1,-0.878 0.056c-4.136,0 -7.5,-3.364 -7.5,-7.5s3.364,-7.5 7.5,-7.5 7.5,3.364 7.5,7.5c0,3.286 -2.126,6.078 -5.073,7.089zM8.5,2a6.508,6.508 0,0 0,-6.5 6.5c0,3.583 2.917,6.5 6.5,6.5s6.5,-2.917 6.5,-6.5 -2.917,-6.5 -6.5,-6.5z" />

safe_ic_warranty_icon.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:drawable="@drawable/ic_warranty_icon"  />
</selector>

Ihr TextView/Layout.

<TextView
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:drawableStart="@drawable/ic_warranty_icon"
       />


<LinearLayout
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:background="@drawable/ic_warranty_icon"
       />
0
Rajesh Gr

Überlappen Sie den Vektor einfach mit der Zustandsliste, dann wird das Problem gelöst

Zum Beispiel haben Sie einen rückseitigen Pfeilvektorbild:

ic_back_arrow.xml

ja, Sie sollten es mit der Layerliste xml (ic_back_arrow_vector_vector.xml) überlappen:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:drawable="@drawable/ic_back_arrow"/>
</layer-list>

Weil logik:

vectorDrawables.useSupportLibrary = true

und

AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);

auf einigen China-Geräten und älteren Samsung-Geräten hilft Ihnen das nicht weiter. Wenn Sie sie nicht überlappen, schlägt dies fehl.

0
mr.boyfox

Wir haben 3 Dinge ausprobiert

vectorDrawables.useSupportLibrary = true

Festlegen von setCompatVectorFromResourcesEnabled in der Anwendungsklasse

static {
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}

Und benutze app:srcCompat

Aber auch danach scheiterte es

Resources$NotFoundException: File res/drawable/$my_icon__0.xml from color state list resource ID #0x7f080008

dann stellten wir fest, dass unser SVG ein Gradient-Tag hatte. Das Konvertieren des Gradienten-Tags in einzelne Pfade für API <= 23 und Verwenden derselben SVG-API> = 24 hat funktioniert.

Diese Antwort hat mir geholfen https://stackoverflow.com/a/47783962/217151

0
Aalap

Einfachste weg verwenden:

  app:drawableRightCompat ="@drawable/ic_mobilelogin"
  app:drawableEndCompat="@drawable/ic_mobilelogin"
app:srcCompat="@drawable/ic_mobile"

und ... Verwenden Sie einfach die App: ** Compat für Kompatibilität

Unterstützung für buil.gradle hinzufügen (Modul)

Android {
 defaultConfig {
vectorDrawables.useSupportLibrary = true
               }
        }
0
Hamed Jaliliani