Comment utiliser les dessins vectoriels avec View en plus d'ImageView avec srcCompat?

app:srcCompat avec app:srcCompat permet une utilisation compatible avec les jeux vectoriels en arrière. Mais comment pouvez-vous les utiliser avec d'autres View s en plus d' ImageView ? Par exemple, les attributs TextView comme android:drawableLeft .

Également en utilisant le vecteur dessinable sous forme d' android:icon avec MenuItem provoqué un accident avec l'exception suivante:

  • Existe-t-il un moyen d'invoquer la navigation à partir du navigateur mobile?
  • Obtenir l'en-tête de la réponse (Rénover / Client OkHttp)
  • ExpandableListView avec un EditText
  • L'ajout d'une simple ScrollView à Gallery provoque une fuite de mémoire
  • Android: conversion Color To Int
  • AlphabetIndexer avec adaptateur personnalisé
  •  Fatal Exception: android.view.InflateException: Binary XML file line #2: Error inflating class <unknown> at android.view.LayoutInflater.createView(LayoutInflater.java:626) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:702) at android.view.LayoutInflater.inflate(LayoutInflater.java:470) at android.view.LayoutInflater.inflate(LayoutInflater.java:398) at android.support.v7.view.menu.MenuItemImpl.setActionView(MenuItemImpl.java:621) at android.support.v7.view.menu.MenuItemImpl.setActionView(MenuItemImpl.java:40) at android.support.v4.view.MenuItemCompat.setActionView(MenuItemCompat.java:310) at android.support.v7.view.SupportMenuInflater$MenuState.setItem(SupportMenuInflater.java:465) at android.support.v7.view.SupportMenuInflater$MenuState.addItem(SupportMenuInflater.java:479) at android.support.v7.view.SupportMenuInflater.parseMenu(SupportMenuInflater.java:196) at android.support.v7.view.SupportMenuInflater.inflate(SupportMenuInflater.java:118) at com.example.niceapp.context.main.MainActivity.onCreateOptionsMenu(MainActivity.java:101) at android.app.Activity.onCreatePanelMenu(Activity.java:2578) 

    Avec Support Library 23.2.0, comment ce problème peut-il être traité?

  • Est-ce que quelqu'un utilise Sencha Touch pour le développement mobile?
  • L'activité a filtré la fenêtre com.android.internal.policy.impl.PhoneWindow$DecorView@46029dd0 qui a été ajouté à l'origine ici
  • Android multi-couleurs dans un TextView
  • Gardez TextInputLayout toujours concentré ou maintenez l'étiquette toujours étendue
  • MVVMCross Change ViewModel dans un MvxBindableListView
  • Comment ancrer le code complet du système d'exploitation Android?
  • 6 Solutions collect form web for “Comment utiliser les dessins vectoriels avec View en plus d'ImageView avec srcCompat?”

    Pour AppCompat version 23.3.0 où aucune solution de travail via le sélecteur XML (réponse acceptée de razzledazzle), nous pouvons le faire par programme:

    Activity_main.xml

     <android.support.v7.widget.AppCompatImageButton android:id="@+id/btnEnter" /> 

    MainActivity.java

     AppCompatImageButton image = (AppCompatImageButton) findViewById(R.id.btnEnter); if (image != null) { VectorDrawableCompat vcAccept = VectorDrawableCompat.create(getResources(), R.drawable.vc_accept, getTheme()); VectorDrawableCompat vcAcceptWhite = VectorDrawableCompat.create(getResources(), R.drawable.vc_accept_white, getTheme()); StateListDrawable stateList = new StateListDrawable(); stateList.addState(new int[]{android.R.attr.state_focused, -android.R.attr.state_pressed}, vcAccept); stateList.addState(new int[]{android.R.attr.state_focused, android.R.attr.state_pressed}, vcAcceptWhite); stateList.addState(new int[]{-android.R.attr.state_focused, android.R.attr.state_pressed}, vcAcceptWhite); stateList.addState(new int[]{}, vcAccept); image.setImageDrawable(stateList); } 

    Ce code est équivalent pour ce sélecteur xml:

     <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_focused="true" android:state_pressed="false" android:drawable="@drawable/vc_accept" /> <item android:state_focused="true" android:state_pressed="true" android:drawable="@drawable/vc_accept_white" /> <item android:state_focused="false" android:state_pressed="true" android:drawable="@drawable/vc_accept_white" /> <item android:drawable="@drawable/vc_accept" /> </selector> 

    METTRE À JOUR

    Si le vecteur dessinable n'est pas affiché à l'aide de l'API 23, vous devez convertir le VectorDrawable en un Drawable premier. Si vous souhaitez utiliser setCompoundDrawablesWithIntrinsicBounds vous devrez le faire, mais pour StateListDrawable, je n'ai pas eu besoin.

     Drawable icon; if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { icon = VectorDrawableCompat.create(getResources(), R.drawable.vc_icon, getContext().getTheme()); } else { icon = getResources().getDrawable(R.drawable.vc_icon, getContext().getTheme()); } 

    Mise à jour 2 : Ils ont ajouté une option pour l'activer dans Support Library 23.4.0:

    Pour les utilisateurs d'AppCompat, nous avons ajouté une API opt-in pour réactiver les dessins vectoriels vectoriels à partir des ressources (le comportement trouvé dans 23.2) via AppCompatDelegate.setCompatVectorFromResourcesEnabled () – gardez à l'esprit que cela peut encore causer des problèmes avec l'utilisation de la mémoire et les problèmes Mise à jour des instances de configuration, donc pourquoi il est désactivé par défaut.

    Mise à jour : cela ne fonctionne plus à partir de la version 23.3.0

    Pour les utilisateurs d'AppCompat, nous avons décidé de supprimer les fonctionnalités qui vous permettent d'utiliser des modèles vectoriels à partir de ressources sur les périphériques pré-Lollipop en raison des problèmes trouvés dans la mise en œuvre dans 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%5D . Utilisation de l'application: srcCompat et setImageResource () continue de fonctionner.

    À partir de la publication Google+ des développeurs d'Android


    Utilisation d'AppCompat et application: srcCompat est la méthode la plus infaillible d'intégration de jeux vectoriels dans votre application.

    Cette citation provient de la publication officielle pour la publication de la version 23.2.0 de la bibliothèque de support.

    L'article mentionne également ce qui suit:

    Vous trouverez directement des jeux vectoriels à distance hors de l' app:srcCompat échouera avant Lollipop. Cependant, AppCompat prend en charge le chargement de dessins vectoriels lorsque ceux-ci sont référencés dans un autre conteneur desserré, comme StateListDrawable , InsetDrawable , LayerDrawable , LevelListDrawable et RotateDrawable . En utilisant cette indirection, vous pouvez utiliser des jeux vectoriels dans des cas tels que l' TextView android:drawableLeft , qui ne serait normalement pas capable de supporter des jeux vectoriels.

    Cela se traduit par les étapes ci-dessous:

    Étape 1:

    Créez ou importez une ressource vectorielle dont vous avez besoin pour l'application. Par exemple, on peut créer un vecteur dessinable pour l'icône de recherche et le nommer ic_action_search_vector.xml

    Étape 2:

    Créez une autre ressource tirée par proxy pour le vecteur dessinable précédemment créé. Disons que, pour l' ic_action_search_vector.xml précédent, ic_action_search.xml peut être créé en tant que simple StateListDrawable qui pourrait contenir les lignes ci-dessous:

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

    Cette étape peut être ignorée si vous avez référencé le vecteur dessinable à partir d'une autre ressource dessinable que vous utiliserez avec votre vue.

    Étape 3:

    Utilisez la ressource drawable (ici, ic_action_search.xml ) qui se réfère au dessin vectoriel ( ic_action_search_vector.xml ) au lieu du vecteur dessinable directement. Pour un menu, il ressemblerait à:

     <item android:id="@+id/search" android:title="@string/search" android:icon="@drawable/ic_action_search" app:showAsAction="always"/> 

    C'est la solution à ce problème!

    Les dessins vectoriels peuvent être utilisés pré-Lollipop dans d'autres endroits que l' app:srcCompat , mais il est fourni avec un prix.

    J'ai fait ce schéma pour vous aider (valable pour la bibliothèque de support 23.4.0 à – au moins – 25.1.0).

    Cheatsheet VectorDrawable

    Vous pouvez ajouter Vector Drawable dans TextView par programme. Utilisez VectorDrawableCompat pour ajouter drawableLeft / drawableRight / drawableTop / drawableBottom / drawableStart / drawableEnd.

    Pas:

    je. Si TextView est dans l'activité:

     TextView tvUserName= (TextView)findViewById(R.id.et_username_or_email); VectorDrawableCompat drawableCompat=VectorDrawableCompat.create(getResources(), R.drawable.layer_list_ic_user, tvUserName.getContext().getTheme()); tvUserName.setCompoundDrawablesRelativeWithIntrinsicBounds(drawableCompat, null, null, null); 

    Ii. Si TextView est à l'intérieur de Fragment:

     TextView tvUserName= (TextView )view.findViewById(R.id.et_username_or_email); VectorDrawableCompat drawableCompat=VectorDrawableCompat.create(getActivity().getResources(), R.drawable.layer_list_ic_user, tvUserName.getContext().getTheme()); tvUserName.setCompoundDrawablesRelativeWithIntrinsicBounds(drawableCompat, null, null, null); 

    Pour plus d'informations sur VectorDrawableCompat, consultez ce lien

    Android 5.0 (niveau API 21) et supérieur fournit un support vectoriel dessiné. Si votre application a un niveau d'API minimum inférieur, Vector Asset Studio ajoute le fichier vectoriel à votre projet; De plus, au moment de la construction, Gradle crée des images raster PNG à différentes résolutions. Gradle génère les densités PNG spécifiées par la propriété DHS (Domain Specific Language) générée dans un fichier build.gradle. Pour générer des PNG, le système de construction nécessite un plugin Android pour Gradle 1.5.0 ou supérieur.

    Ceci n'est pas vrai si vous incluez dans votre gradle vectorDrawables.useSupportLibrary = true

    Soit défini sur false ou supprimez complètement la ligne et tous vos vecteurs fonctionneront tel quel. Mais pour les anciennes versions d'Android, ils pourront compter sur le PNG converti

    J'utilise une nouvelle bibliothèque de support et tout ce que j'ai à faire est:

     compile 'com.android.support:appcompat-v7:25.1.1' 

    Dans le fichier Build.gradle

      defaultConfig { vectorDrawables.useSupportLibrary = true } 

    Maintenant, où que vous utilisiez comme fragment, activité ou adaptateur, utilisez-le comme première ligne de votre classe

     static { AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); } 

    Après que l'utilisation fonctionne comme nous l'avons fait auparavant, quelque chose.xml

     <ImageView android:id="@+id/ivMainNavigationIcon" android:layout_width="wrap_content" android:layout_height="wrap_content" /> 

    Something.java

     thumbIcon.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.ic_check_circle_black_24dp)); 

    Ou si vous avez un identifiant distinctif doit être défini de manière dynamique

     thumbIcon.setImageDrawable(ContextCompat.getDrawable(context,drawableID)); 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.