web-dev-qa-db-fra.com

Les vecteurs de support AppCompat 23.3 ne fonctionnent plus?

J'utilisais le dessin vectoriel de support ajouté dans Support Library 23.2 avec AppCompat. J'utilisais des dessins vectoriels avec app:srcCompat et à l'intérieur d'un StateListDrawable pour que je puisse les utiliser avec Android:drawableLeft pour mon TextView.

Depuis la mise à niveau vers la version 23.3.0 d'AppCompat, seuls les vecteurs dans app:srcCompat travaillent. Chaque fois que je le référence dans l'autre sens, je reçois

FATAL EXCEPTION: main
 Java.lang.RuntimeException: Unable to start activity ComponentInfo{com.my.package.name/.MainActivity}: Android.view.InflateException: Binary XML file line #8: Error inflating class Button
 ...
 Caused by: Android.view.InflateException: Binary XML file line #8: Error inflating class Button
 ...
 Caused by: org.xmlpull.v1.XmlPullParserException: Binary XML file line #14: invalid drawable tag vector
  at Android.graphics.d

Qu'est-ce qui a changé qui fait maintenant échouer mon dessin vectoriel de support dans certains cas?

32
ianhanniballake

Mise à jour: Ils le réactivent dans la bibliothèque de support 23:

Pour les utilisateurs d'AppCompat, nous avons ajouté une API opt-in pour réactiver la prise en charge de Vector Drawables à partir des ressources (le comportement trouvé en 23.2) via AppCompatDelegate.setCompatVectorFromResourcesEnabled (true); - gardez à l'esprit que cela peut toujours provoquer des problèmes d'utilisation de la mémoire et des problèmes de mise à jour des instances de configuration, d'où la raison pour laquelle il est désactivé par défaut.

Vérifiez ce lien: 23.4.0 disponible maintenant
--------------------------------------------- --------------

Selon le annonce de sortie pour Android Support Library 23. :

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 détectés dans la mise en œuvre 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.

Il s'agit donc d'un changement de comportement attendu. Vous devrez utiliser des graphiques non vectoriels dans tous les cas non traités par srcCompat.

Si vous souhaitez continuer à utiliser des vecteurs avant l'API 21, vous pouvez supprimer la ligne

vectorDrawables.useSupportLibrary = true

(ou l'équivalent si vous utilisez le plugin 1.5 Gradle comme indiqué dans le article de blog 23.2 ).

Cela entraînera Android Studio pour générer des fichiers PNG au moment de la compilation pour les applications avec une version minSdk inférieure à API 21 tout en utilisant vos vecteurs sur les appareils API 21+, vous permettant de conserver le même code qu'avec 23.2.1 Au prix d'une taille APK supplémentaire.

41
ianhanniballake

La prise en charge de VectorDrawable pour pré-Lollipop a été ajoutée dans la bibliothèque de support 23.2.0, puis partiellement supprimée dans 23.3.0. Dans les versions 23.4.0 et supérieures (au moins 25.1.0), cette partie supprimée est de retour, mais derrière un drapeau optionnel (car elle a un prix).

Pour résumer: dans la bibliothèque de support 23.4.0 à au moins 25.1.0, vous pouvez faire fonctionner VectorDrawable dans certains cas.

J'ai fait ce diagramme pour aider.

VectorDrawable cheatsheet

17
David Ferrand

Pour utiliser des vecteurs comme compoundDrawables (ex. Pour textview) sans utiliser

AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);

ce qui conduit à une utilisation élevée de la mémoire documentée, gonflez simplement le vecteur en utilisant

Drawable drawable = AppCompatResources.getDrawable( getContext(), R.drawable.vector_resID );
if( drawable != null ) drawable.setBounds( 0, 0, iconSize, iconSize );
TextViewCompat.setCompoundDrawablesRelative( textView, null, null, drawable, null);

Voici comment fonctionne navDrawer

4
nGL