J'utilise la version de la bibliothèque de support technique de Design 23.4.0 . J'ai activé le drapeau gradle:
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
J'utilise les outils de construction version 23.0.2 , mais je reçois toujours Resources$NotFoundException
sur KitKat ou une version inférieure.
Cela se produit lorsque j'utilise Android:drawableLeft
ou imageView.setImageResource(R.drawable.drawable_image)
.
Et oui, je mets ceci sur toutes les activités où j'utilise drawables
static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}
Est-ce un bug de la bibliothèque de support?
Il a fallu 3 choses distinctes pour que cela fonctionne avec la bibliothèque de support 23.4.0:
Ajouter ceci à build.gradle
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
Ajouter ce qui suit à onCreate de votre classe d'application
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
Pour toutes les vues XML dans lesquelles vous définissez un vecteur extractible, remplacez
Android:src
avec
app:srcCompat
et dans le code, remplacez ceci:
imageView.setImageResource(...);
avec
imageView.setImageDrawable(...);
Pour compléter certaines des réponses fournies ici: la prise en charge rétro-compatible de VectorDrawables a un prix et ne fonctionne pas dans tous les cas.
Dans quels cas ça marche? J'ai créé ce diagramme pour aider (valide pour Support Library 23.4.0 à au moins 25.1.0).
Essayez d'utiliser:
imageView.setImageDrawable(VectorDrawableCompat.create(getResources(), drawableRes, null));
Vous n'avez pas à ajouter AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
De cette façon.
Gonflez simplement vos dessins vectoriels à l’aide de VectorDrawableCompat et vous êtes prêt.
On avait le même problème. Les objets vectoriels n'étaient pas visibles sur KitKat. J'ai résolu ce problème en ajoutant AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
à la méthode d'activités OnCreate.
Avant cela, n'oubliez pas d'ajouter:
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
et appelez setImageResource pour la vue selon laquelle vous utilisez le vecteur pouvant être dessiné. Mon point de vue est ImageButton. J'ai des outils de génération de SDK Android version 23.0.3
Désolé d'être en retard pour la partie mais cette réponse peut aider les utilisateurs qui souhaitent activer l'indicateur AppCompatDelegate.setCompatVectorFromResourcesEnabled (true); pour toutes les activités.
1. Créer une classe qui s'étend à Application (Android.app.Application)
public class MyApplicationClass extends Application
{
@Override
public void onCreate()
{
super.onCreate();
}
}
2. Rendez-vous sur Manifest.xml et ajoutez la ligne suivante à votre tag
<application
Android:name=".MyApplicationClass"
Android:allowBackup="true"
Android:icon="@mipmap/ic_launcher"
Android:label="@string/app_name"
Android:roundIcon="@mipmap/ic_launcher_round"
Android:supportsRtl="true"
Android:theme="@style/AppTheme">
...
</application>
3. Ajoutez le code suivant ci-dessus onCreate dans MyApplicationClass.Java
// This flag should be set to true to enable VectorDrawable support for API < 21
static
{
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}
Code complet pour MyApplicationClass.Java
import Android.app.Application;
import Android.support.v7.app.AppCompatDelegate;
/**
* Created by Gaurav Lonkar on 23-Dec-17.
*/
public class MyApplicationClass extends Application
{
// This flag should be set to true to enable VectorDrawable support for API < 21
static
{
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}
@Override
public void onCreate()
{
super.onCreate();
}
}
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
utiliser ceci dans app.gradle
Puis utilisez AppCompatDrawableManager
pour définirDrawable et getDrawable. Travaille pour moi
La prise en charge des dessins vectoriels dans des endroits tels que Android:drawableLeft
a été désactivée dans la bibliothèque de support 23.3. Cela a été annoncé sur Google+ :
nous avons décidé de supprimer la fonctionnalité qui vous permettait d’utiliser Vector tirables à partir de ressources sur des appareils pré-Lollipop en raison de problèmes trouvés dans l'implémentation en version 23.2.0/23.2.1. Utilisation de app: srcCompat et setImageResource () continue à travailler.
Liens vers des numéros:
Toutefois, si vous parvenez à résoudre ces problèmes, vous pouvez réactiver cette fonctionnalité à l’aide de - AppCompatDelegate.setCompatVectorFromResourcesEnabled () .
Si vous êtes curieux de savoir comment cela fonctionne, la meilleure personne à apprendre est Chris Banes, auteur de cette fonctionnalité. Il explique en détail sur son blog .
changement
imageView.setImageResource(R.drawable.drawable_image)
à
imageView.setImageDrawable(ContextCompat.getDrawable(getContext(), R.drawable.drawable_image));
si vous voulez utiliser vectordrawable en XML, utilisez ceci:
app:srcCompat="@drawable/drawable_image"
Ne mettez pas vos vecteurs dans drawable-anydpi
, Les anciens appareils ne supportent pas cela
mettez-les dans drawable
`VectorDrawable`
et `AnimatedVectorDrawable`
dans cette bibliothèque de support peuvent être gonflés de la manière suivante:
getDrawable()
statiques:// Cela ne fera que gonfler un dessin avec <vecteur> comme élément racine VectorDrawable.getDrawable (context, R.drawable.ic_arrow_vector); // Cela ne fera que gonfler un dessin avec <animated- vector> en tant qu'élément racine AnimatedVectorDrawable.getDrawable (contexte, R.drawable.ic_arrow_to_menu_animated_vector); // Ceci gonfle tout dessin et se replie automatiquement sur l'implémentation Lollipop sur les périphériques api 21+ ResourcesCompat.getDrawable (context, R.drawable.any_drawable);
Si vous gonflez le code Drawable en Java, il est recommandé de toujours utiliser ResourcesCompat.getDrawable()
car cela gère le repli de Lollipop, le cas échéant. Cela permet au système de mettre en cache Drawable ConstantState et est donc plus efficace.
La bibliothèque a les animations de morphing (bidirectionnelles) suivantes:
API 16
:import com.wnafee.vector.compat.AnimatedVectorDrawable;
mdrawable = (AnimatedVectorDrawable) AnimatedVectorDrawable.getDrawable(this.getApplicationContext(), R.drawable.consolidated_animated_vector);
Regardez le github README pour vector-compat
ici: https://github.com/wnafee/vector-compat
Cela résoudra votre problème (jusqu'à API 14
) si vous le fusionnez avec le build.gradle
dependencies
de votre module d'application (généralement à la fin du fichier):
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
//Trying to FIX Binary XML file line #2: invalid drawable tag animated-vector
compile 'com.Android.support:appcompat-v7:25.0.0'
compile 'com.Android.support:design:25.0.0'
//not needed
// compile 'com.Android.support:support-vector-drawable:25.0.0'
compile 'com.wnafee:vector-compat:1.0.5'//*******holy grail *******https://github.com/wnafee/vector-compat
// Failed to resolve: com.Android.support:support-animated-vector-drawable:25.0.0
//not needed
// compile 'com.Android.support:support-animated-vector-drawable:25.0.0'
}
Utilisez AppCompatImageView
au lieu de ImageView
comme le dit Harish Gyanani dans les commentaires, cela fonctionne très bien avec cela pour moi.
Dans mon cas particulier, j’avais ce problème parce que j’utilisais un sélecteur pouvant être dessiné en tant que ressource d’image avec plusieurs vecteurs dans le sélecteur, comme dans:
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:state_selected="true" Android:drawable="@drawable/vector_select_blue"/>
<item Android:state_pressed="true" Android:drawable="@drawable/vector_select_black"/>
.
.
etc
</selector>
Oui, pas mal, mais je ne savais pas mieux à l'époque.
Donc, la bonne façon de faire consiste à utiliser la propriété tint dans votre fichier vectoriel, comme dans:
<vector ..vector properties..
Android:tint="@color/vector_color_selector">
<path ..path properties../>
</vector>
(Vous pouvez également utiliser l'attribut app: tint dans AppCompatImageView)
Et maintenant, votre fichier vector_color_selector devrait avoir les couleurs que vous voulez, comme dans:
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:state_selected="true" Android:color="@color/blue"/>
<item Android:state_pressed="true" Android:color="@color/black"/>
.
.
etc
</selector>
J'espère que cela aidera quelqu'un si les réponses précédentes ne vous ont pas aidé. En énonçant une évidence, mais je dois dire que vous devez toujours définir vectorDrawables.useSupportLibrary = true dans gradle, utilisez AppCompatImageView et utilisez app: srcCompat ou setImageDrawable + AppCompatResources.getDrawable pour éviter tout problème avec la bibliothèque de compatibilité vectorielle.