Ich verwende Vector Drawables in Android vor Lollipop und dies sind einige meiner Bibliotheken und Tool-Versionen:
- 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 in meiner App-Ebene hinzugefügt Build.Gradle
android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
}
Es ist auch erwähnenswert, dass ich ein zusätzliches Zeichenelement wie LayerDrawable (layer_list) verwende, wie im offiziellen Android-Blog ( Link hier ) angegeben, um Zeichenelemente für Vektorzeichen außerhalb von zu setzenapp:srcCompat
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/search"/>
</level-list>
Sie finden direkt referenzierende Vektorzeichnungen außerhalb der App: srcCompat schlägt vor Lollipop fehl. AppCompat unterstützt jedoch das Laden von Vektor-Drawables, wenn auf sie in einem anderen Drawable-Container verwiesen wird, z. B. StateListDrawable, InsetDrawable, LayerDrawable, LevelListDrawable und RotateDrawable. Mit dieser Indirektion können Sie Vektor-Drawables in Fällen wie dem android: drawableLeft-Attribut von TextView verwenden, das normalerweise keine Vector-Drawables unterstützen kann.
Wenn ich app:srcCompat
alles benutze , funktioniert alles gut, aber wenn ich benutze:
android:background
android:drawableLeft
android:drawableRight
android:drawableTop
android:drawableBottom
auf ImageView
, ImageButton
, TextView
oder EditText
vor dem Lutscher, wirft es ein expection:
Caused by: android.content.res.Resources$NotFoundException: File res/drawable/search_toggle.xml from drawable resource ID #0x7f0200a9
quelle
Antworten:
NEUESTES UPDATE - Jun / 2019
Die Support-Bibliothek hat sich seit der ursprünglichen Antwort etwas geändert. Jetzt kann sogar das Android-Plugin für Gradle das PNG beim Erstellen automatisch generieren. Im Folgenden sind zwei neue Ansätze aufgeführt, die heutzutage funktionieren sollten. Weitere Informationen finden Sie hier:
PNG-Erzeugung
Gradle kann zum Zeitpunkt der Erstellung automatisch PNG-Bilder aus Ihren Assets erstellen. Bei diesem Ansatz werden jedoch nicht alle XML-Elemente unterstützt . Diese Lösung ist praktisch, da Sie nichts in Ihrem Code oder in Ihrem build.gradle ändern müssen. Stellen Sie einfach sicher, dass Sie Android Plugin 1.5.0 oder höher und Android Studio 2.2 oder höher verwenden .
Ich verwende diese Lösung in meiner App und funktioniert einwandfrei. Kein zusätzliches build.gradle- Flag erforderlich. Es sind keine Hacks erforderlich. Wenn Sie zu / build / generate / res / pngs / ... gehen , werden alle generierten PNGs angezeigt.
Wenn Sie also ein einfaches Symbol haben (da nicht alle XML-Elemente unterstützt werden), funktioniert diese Lösung möglicherweise für Sie. Aktualisieren Sie einfach Ihr Android Studio und Ihr Android-Plugin für Gradle.
Support-Bibliothek
Wahrscheinlich ist dies die Lösung, die für Sie funktioniert. Wenn Sie hierher gekommen sind, bedeutet dies, dass Ihr Android Studio die PNGs nicht automatisch generiert. Ihre App stürzt also ab.
Oder vielleicht möchten Sie nicht, dass Android Studio überhaupt PNG generiert.
Anders als bei der "Auto-PNG-Generierung", die eine Teilmenge des XML-Elements unterstützt, unterstützt diese Lösung alle XML-Tags. Sie haben also volle Unterstützung für Ihre Vektorzeichnung.
Sie müssen zuerst Ihr build.gradle aktualisieren , um es zu unterstützen:
Und dann
app:srcCompat
anstelle vonandroid:src
beim Laden verwendenVectorDrawables
. Vergiss das nicht.Für
TextView
, wenn Sie die verwendenandroidx
Version des Supports Library, können Sieapp:drawableLeftCompat
(oder rechts, oben, unten) stattapp:drawableLeft
Verwenden Sie im Fall von
CheckBox
/ anstelle von .RadioButton
app:buttonCompat
android:button
Wenn Sie die
androidx
Version der Support-Bibliothek nicht verwenden und IhrminSdkVersion
is17
oder höher ist oder eine Schaltfläche verwendet, können Sie versuchen, programmgesteuert über zu setzenUPDATE - Jul / 2016
Sie haben VectorDrawable in der
Android Support Library 23.4.0 wieder aktiviert
Möglicherweise ist die
build.gradle
Einstellung jetzt veraltet und Sie müssen sie nur für ordnungsgemäße Aktivitäten aktivieren (müssen jedoch getestet werden).Um es jetzt zu aktivieren, müssen Sie Folgendes tun:
Ursprüngliche Antwort - Apr / 2016
Ich denke, dies geschieht, weil Support Vector in der neuesten Bibliotheksversion 23.3.0 deaktiviert wurde
Nach diesem POST :
Wenn Sie das Problem AUSGABE 205236 besuchen , werden sie anscheinend in Zukunft aktiviert, aber das Speicherproblem wird nicht bald behoben:
Ich hatte ein ähnliches Problem. In meinem Fall habe ich also alle Symbole zurückgesetzt, die Vektoren verwenden, die von Ressourcen- zu PNG-Bildern gezeichnet werden können (da das Speicherproblem auch dann weiterhin auftritt, wenn sie eine Option zum erneuten Aktivieren bieten).
Ich bin nicht sicher, ob dies die beste Option ist, aber es behebt meiner Meinung nach alle Abstürze.
quelle
vectorDrawables.useSupportLibrary = true
Peropertie nicht entfernt , um die Generierung von PNGs zur Erstellungszeit wieder zu aktivieren ?Ich hatte das gleiche Problem. Aber ich habe viel Forschung und Entwicklung betrieben und die Antwort bekommen.
Geben Sie für die Verwendung von Imageview und ImageButton
app:srcCompat="@drawable/...."
sowie für andere Ansichten wie Button und Textview anstelle der Verwendung"drawableLeft/right..."
in XML programmgesteuert Drawables an:Und verwenden Sie "AppCompatResources", um das Drawable zu erhalten.
quelle
Um die anderen sehr guten Antworten zu erläutern , finden Sie hier ein Diagramm , das Ihnen helfen kann. Es ist gültig, wenn Sie eine Support-Bibliothek von 23.4.0 bis mindestens 25.1.0 haben.
quelle
Die Antwort von Guillherme P ist ziemlich großartig. Um eine kleine Verbesserung zu erzielen, müssen Sie diese Zeile nicht in jeder Aktivität hinzufügen. Wenn Sie sie einmal in der Anwendungsklasse hinzugefügt haben, funktioniert sie auch.
ERINNERN SIE SICH: Sie müssen die Verwendung der Support-Bibliothek in gradle noch aktiviert haben:
Also, stellen Sie sicher , dass Sie eine Support - Bibliothek Version größer als v23.4 verwenden, wenn Google hinzugefügt , um die Unterstützung für Drawable Container zurück für VectorDrawables ( Release-Info )
Aktualisieren
Und für Codeänderungen:
app:srcCompat
jedem Ort aktualisieren , an dem dasandroid:src
Attribut akzeptiert wird (die IDE warnt Sie, wenn es wie für das<bitmap>
Tag ungültig ist ).Für
drawableLeft
,drawableStart
,drawableRight
,drawableEnd
Attribute verwendet inTextView
und ähnliche Ansichten, werden Sie sie haben jetzt programmatisch zu setzen. Ein Beispiel für die EinstellungdrawableStart
:quelle
Ich hatte das gleiche Problem. Und beheben Sie es durch Entfernen
Meine Zielversion ist 25 und die Support-Bibliothek ist
quelle
vectorDrawables.useSupportLibrary = true
VectorDrawables auf Pre-Lollipop sollten ohne Verwendung einwandfrei funktionieren
Wenn Sie VectorDrawables in ImageViews verwenden möchten, können Sie das Attribut verwenden,
srcCompat
und es funktioniert, in Buttons oder TextViews jedoch nicht. Daher müssen Sie das Drawable in ein InsetDrawable oder ein LayerDrawable einbinden. Es gibt noch einen anderen Trick, den ich entdeckt habe: Wenn Sie Datenbindung verwenden, können Sie dies tun:Das wird auf magische Weise funktionieren. Ich habe nicht untersucht, was hinter den Kulissen passiert, aber ich denke, dass TextView die Methode getDrawable von AppCompatResources oder ähnlichem verwendet.
quelle
Viel F & E, endlich diese Lösung für Abstürze auf Pre-Lollipop-Geräten.
Für die Bildansicht
Für TextView / EditText
Für Build.gradle
quelle
Für alle, die auf Android Gradle 3.0 und höher aktualisieren, ist es nicht erforderlich, zu verwenden
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)
oder festzulegenvectorDrawables.useSupportLibrary = true
(dies führt zu Problemen) und zu verwendenapp:srcCompat
, es funktioniert einfach.Nehmen Sie sich zwei Tage Zeit, um dies herauszufinden, und finden Sie keine verwandten Dokumente in den Google-Dokumenten ...
quelle
Einfachste Verwendung:
und ... nur
app:**Compat
zur Kompatibilität verwenden. Fügen Sie auch Unterstützung hinzu fürbuild.gradle
(Modul)quelle
Ich verwende VectorDrawables auf Pre-Lollipop-Geräten und gehe folgendermaßen vor:
Schritt 1: Fügen Sie dies in Ihre App-Ebene ein.
Schritt 2:
Fügen Sie dies in Ihre Anwendungsklasse ein und vergessen Sie nicht, Ihre Anwendungsklasse in der Manifestdatei zu registrieren.
Schritt 3:
Holen Sie sich VectorDrawables mit,
quelle
Nach Verwendung des folgenden Codes.
Dennoch besteht ein Vektorbildproblem für die folgenden Attribute
DrawableEnd, DrawableStart, DrawableTop, DrawableBottom, Hintergrund
In diesem Fall folgen Sie bitte den nachstehenden Anweisungen. Verwenden Sie anstelle der direkten Referenzierung des Vektorbilds das Selektor-Tag als Zwischenzeichnung.
Beispiel:
ic_warranty_icon.xml
safe_ic_warranty_icon.xml
Ihre Textansicht / Ihr Layout.
quelle
selector
Wir haben 3 Dinge ausprobiert
Festlegen von setCompatVectorFromResourcesEnabled in der Anwendungsklasse
Und verwenden
app:srcCompat
Aber auch danach scheiterte es mit
Dann stellten wir fest, dass unser SVG ein Gradient-Tag hatte. Das Konvertieren des Gradienten-Tags in einzelne Pfade für die unten stehende API <= 23 und die Verwendung derselben SVG-API> = 24 hat funktioniert.
Hilfe von dieser Antwort erhalten https://stackoverflow.com/a/47783962/2171513
quelle
Überlappen Sie einfach den Vektor, der auf die Statusliste gezeichnet werden kann, und das Problem wird gelöst
Zum Beispiel haben Sie einen Pfeil mit einem Pfeil nach hinten:
Ja, Sie sollten es mit der Layer-Liste xml (ic_back_arrow_vector_vector.xml) überlappen:
Weil Logik:
und
wird Ihnen auf einigen China-Geräten und älteren Samsung-Geräten nicht helfen. Wenn Sie sie nicht überlappen, schlägt dies fehl.
quelle
Ich hatte stundenlang damit zu kämpfen.
Ich habe alles versucht, was mir diese Antworten sagten, aber meine App hat nicht aufgehört zu stürzen. Ich habe diese Zeile gelöscht:
app:srcCompat="@drawable/keyboard"
und meine App stürzte nicht mehr ab. und als ich dasselbe wieder hinzufügte, fing es wieder an zu stürzen. Also habe ich beschlossen, diese Datei zu öffnen, und in der ersten Zeile wurde ein Fehler angezeigtIch habe mit der rechten Maustaste auf die Datei geklickt und auf "Im Explorer anzeigen" geklickt. Sie befand sich nicht im Ordner "drawable", sondern im Verzeichnis "drawable-v24". Also habe ich es kopiert und in das zeichnbare Verzeichnis eingefügt und schließlich Abstürze beseitigt.
quelle
Der Vorschlag von Guilherme P hat bei mir nicht funktioniert. Ich habe die Entscheidung getroffen, PNGs zu verwenden, bei denen ich Dinge außerhalb der App ausführen muss: srcCompat, dh drawableLeft, drawableRight usw. Dies war eine ziemlich einfache Änderung und weist keine potenziellen Speicherprobleme auf. AppCompatDelegate.setCompatVectorFromResourcesEnabled ( wahr); stellt vor.
quelle
Eine Alternative zu Bennys Antwort besteht darin, eine
Activity
Superklasse zu erstellen :Jetzt verlängern
VectorDrawableActivity
stattAppCompatActivity
.quelle