J'utilise des dessins vectoriels dans Android avant Lollipop et voici quelques-unes de mes bibliothèques et versions d'outils:
- Studio Android: 2.0
- Plugin Android Gradle: 2.0.0
- Outils de construction: 23.0.2
- Bibliothèque de support Android: 23.3.0
J'ai ajouté cette propriété au niveau de mon application Build.Gradle
android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
}
Il convient également de mentionner que j'utilise un dessin supplémentaire tel que LayerDrawable (layer_list) comme indiqué dans le blog officiel d'Android ( lien ici ) pour définir les dessinables pour les dessins vectoriels en dehors deapp:srcCompat
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/search"/>
</level-list>
Vous trouverez des dessins vectoriels faisant directement référence en dehors de l'application: srcCompat échouera avant Lollipop. Cependant, AppCompat prend en charge le chargement de dessinables vectoriels lorsqu'ils sont référencés dans un autre conteneur dessinable tel qu'un StateListDrawable, InsetDrawable, LayerDrawable, LevelListDrawable et RotateDrawable. En utilisant cette indirection , vous pouvez utiliser des dessins vectoriels dans des cas tels que l'attribut android: drawableLeft de TextView, qui ne serait normalement pas capable de prendre en charge les dessinables vectoriels.
Quand j'utilise app:srcCompat
tout fonctionne bien, mais quand j'utilise:
android:background
android:drawableLeft
android:drawableRight
android:drawableTop
android:drawableBottom
sur ImageView
, ImageButton
, TextView
ou EditText
avant Lollipop, il jette un expection:
Caused by: android.content.res.Resources$NotFoundException: File res/drawable/search_toggle.xml from drawable resource ID #0x7f0200a9
la source
Réponses:
DERNIÈRE MISE À JOUR - Juin / 2019
La bibliothèque de support a un peu changé depuis la réponse originale. Désormais, même le plugin Android pour Gradle est capable de générer automatiquement le PNG au moment de la construction. Voici donc deux nouvelles approches qui devraient fonctionner de nos jours. Vous pouvez trouver plus d'informations ici:
Génération PNG
Gradle peut créer automatiquement des images PNG à partir de vos ressources au moment de la construction. Cependant, dans cette approche, tous les éléments xml ne sont pas pris en charge . Cette solution est pratique car vous n'avez rien à modifier dans votre code ou dans votre build.gradle. Assurez-vous simplement que vous utilisez Android Plugin 1.5.0 ou supérieur et Android Studio 2.2 ou supérieur .
J'utilise cette solution dans mon application et fonctionne correctement. Aucun indicateur build.gradle supplémentaire n'est nécessaire. Aucun piratage n'est nécessaire. Si vous allez dans / build / generated / res / pngs / ... vous pouvez voir tous les PNG générés.
Donc, si vous avez une icône simple (puisque tous les éléments xml ne sont pas pris en charge), cette solution peut fonctionner pour vous. Mettez simplement à jour votre Android Studio et votre plugin Android pour Gradle.
Bibliothèque d'assistance
C'est probablement la solution qui fonctionnera pour vous. Si vous êtes venu ici, cela signifie que votre Android Studio ne génère pas automatiquement les PNG. Donc, votre application plante.
Ou peut-être que vous ne voulez pas du tout qu'Android Studio génère des fichiers PNG.
Contrairement à cette "génération Auto-PNG" qui prend en charge un sous-ensemble d'éléments XML, cette solution prend en charge toutes les balises xml. Ainsi, vous avez un support complet pour votre dessin vectoriel.
Vous devez d'abord mettre à jour votre build.gradle pour le prendre en charge:
Et puis, utilisez
app:srcCompat
au lieu deandroid:src
lors du chargementVectorDrawables
. N'oublie pas ça.Pour
TextView
, si vous utilisez laandroidx
version de la bibliothèque de support, vous pouvez utiliserapp:drawableLeftCompat
(ou droite, haut, bas) au lieu deapp:drawableLeft
Dans le cas de
CheckBox
/RadioButton
, utilisez à laapp:buttonCompat
place deandroid:button
.Si vous n'utilisez pas la
androidx
version de la bibliothèque de support et que votre versionminSdkVersion
est17
ou supérieure ou si vous utilisez un bouton, vous pouvez essayer de définir par programme viaMISE À JOUR - Juil / 2016
Ils ont réactivé ce VectorDrawable dans la
bibliothèque de support Android 23.4.0
Peut - être ,
build.gradle
paramètre est maintenant obsolète et qu'il vous suffit de l'activer dans les activités appropriées (cependant, vous devez tester).Maintenant, pour l'activer, vous devez faire:
Réponse originale - avril / 2016
Je pense que cela se produit parce que Support Vector a été désactivé dans la dernière version de la bibliothèque: 23.3.0
Selon ce POST :
Si vous visitez le problème ISSUE 205236 , il semble qu'ils seront activés à l'avenir, mais le problème de mémoire ne sera pas résolu bientôt:
J'ai eu un problème similaire. Donc, dans mon cas, j'ai rétabli toutes les icônes qui utilisent le vecteur dessiné à partir d'une ressource en images PNG (puisque le problème de mémoire continuera à se produire même après avoir fourni une option pour l'activer à nouveau).
Je ne sais pas si c'est la meilleure option, mais cela corrige tous les plantages à mon avis.
la source
vectorDrawables.useSupportLibrary = true
possibilité de revenir à l'activation de la génération de png au moment de la construction ?J'ai eu le même problème. Mais en faisant beaucoup de R&D, j'ai eu la réponse.
Pour Imageview et ImageButton,
app:srcCompat="@drawable/...."
et pour d'autres vues comme Button, Textview, au lieu d'utiliser"drawableLeft/right..."
dans le XML, spécifiez les drawables par programme comme:Et utilisez "AppCompatResources" pour obtenir le dessinable.
la source
Pour élaborer sur les autres très bonnes réponses , voici un schéma qui peut vous aider. Il est valide si vous avez la bibliothèque de support de 23.4.0 à au moins 25.1.0.
la source
La réponse de Guillherme P est assez impressionnante. Juste pour apporter une petite amélioration, vous n'avez pas besoin d'ajouter cette ligne dans chaque activité, si vous l'avez ajoutée une fois dans la classe Application, cela fonctionnera également.
RAPPELEZ-VOUS: Vous devez toujours avoir activé l'utilisation de la bibliothèque de support dans gradle:
Assurez-vous également que vous utilisez une version de bibliothèque de support supérieure à la v23.4, lorsque Google a rajouté la prise en charge des conteneurs Drawable pour VectorDrawables ( note de publication )
Mettre à jour
Et pour les changements de code:
app:srcCompat
chaque endroit qui accepte l'android:src
attribut (l'EDI vous avertira s'il est invalide comme pour la<bitmap>
balise).Pour
drawableLeft
,drawableStart
,drawableRight
,drawableEnd
attributs utilisés dansTextView
et des vues similaires, vous devrez les définir par programme pour l' instant. Un exemple de réglagedrawableStart
:la source
J'ai eu le même problème. Et corrigez-le en supprimant
Ma version cible est 25 et la bibliothèque de support est
la source
vectorDrawables.useSupportLibrary = true
VectorDrawables sur pré-sucette devrait fonctionner correctement sans utiliser
Si vous souhaitez utiliser VectorDrawables dans ImageViews, vous pouvez utiliser l'attribut
srcCompat
et cela fonctionnera, mais dans Buttons ou TextViews, ce ne sera pas le cas , vous devez donc envelopper le Drawable dans un InsetDrawable ou un LayerDrawable. Il y a une autre astuce que j'ai découverte, si vous utilisez la liaison de données, vous pouvez le faire:Cela fonctionnera comme par magie, je n'ai pas enquêté sur ce qui se passe dans les coulisses, mais je suppose que TextView utilise la méthode getDrawable de AppCompatResources ou similaire.
la source
Beaucoup de R&D, pour enfin obtenir cette solution pour les plantages sur les appareils pré-sucette
Pour Imageview
Pour TextView / EditText
Pour Build.gradle
la source
Utilisation la plus simple:
et ... juste utiliser
app:**Compat
pour la compatibilité. Ajouter également le support surbuild.gradle
(module)la source
Pour toute personne qui met à niveau vers Android Gradle 3.0 et supérieur, il n'est pas nécessaire d'utiliser
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)
ou de définirvectorDrawables.useSupportLibrary = true
(ajouter cela causera un problème) et d'utiliserapp:srcCompat
, cela fonctionne simplement.Prenez-moi deux jours pour comprendre cela, et je n'ai trouvé aucun document connexe dans les documents de Google ...
la source
J'utilise VectorDrawables sur des appareils Pre-lollipop et voici comment je le fais: -
Étape 1: mettez ceci dans le niveau de votre application.
Étape 2:
Mettez ceci dans votre classe Application et n'oubliez pas d'enregistrer votre classe Application dans le fichier manifeste.
Étape 3:
Obtenez VectorDrawables en utilisant,
la source
Après avoir utilisé le code ci-dessous.
encore, un problème d'images vectorielles existe pour les attributs ci-dessous sont
DrawableEnd, DrawableStart, DrawableTop, DrawableBottom, Arrière-plan
Dans ce cas, veuillez suivre comme ci-dessous, au lieu de référencer l'image vectorielle directement, utilisez la balise de sélection comme fichier intermédiaire pouvant être dessiné.
Exemple:
ic_warranty_icon.xml
safe_ic_warranty_icon.xml
Votre TextView / Layout.
la source
selector
Nous avons essayé 3 choses
Définition de setCompatVectorFromResourcesEnabled dans la classe Application
Et utilise
app:srcCompat
Mais même après ça, ça échouait avec
puis nous avons compris que notre SVG avait une balise Gradient. La conversion de la balise de dégradé en chemins individuels pour l'API ci-dessous <= 23 et l'utilisation de la même API SVG> = 24 a fonctionné.
J'ai obtenu de l'aide de cette réponse https://stackoverflow.com/a/47783962/2171513
la source
Chevauchez simplement le vecteur dessiné à la liste d'états, le problème sera résolu
Par exemple, vous avez une image vectorielle de flèche arrière:
oui, vous devez le superposer à la liste de calques xml (ic_back_arrow_vector_vector.xml):
Parce que la logique:
et
ne vous aidera pas sur certains appareils chinois et anciens appareils Samsung. Si vous ne les chevauchez pas, cela échouera.
la source
Je me débattais avec ça pendant des heures.
J'ai essayé tout ce que ces réponses m'ont dit, mais mon application n'a pas cessé de planter. J'ai supprimé cette ligne:
app:srcCompat="@drawable/keyboard"
et mon application a cessé de planter. et puis quand j'ai ajouté cette même chose, il a recommencé à planter. J'ai donc décidé d'ouvrir ce fichier et j'ai vu une erreur à la première ligne disantJ'ai cliqué avec le bouton droit sur le fichier et cliqué sur "Afficher dans l'explorateur" et ce n'était pas dans le dossier drawable mais dans le répertoire drawable-v24. Je l'ai donc copié et collé dans le répertoire drawable et finalement je me suis débarrassé des plantages.
la source
La suggestion de Guilherme P ne fonctionnait pas pour moi. Je suis allé de l'avant et j'ai pris la décision d'utiliser des png là où je dois faire des choses en dehors de l'application: srcCompat ie drawableLeft, drawableRight, etc. C'était un changement assez facile à faire, et n'a pas les problèmes de mémoire potentiels AppCompatDelegate.setCompatVectorFromResourcesEnabled ( vrai); introduit.
la source
Une alternative à la réponse de Benny est de créer une
Activity
superclasse:Maintenant, étendez
VectorDrawableActivity
au lieu deAppCompatActivity
.la source