Bibliothèque de soutien ressources VectorDrawable$NotFoundException
j'utilise la version 23.4.0 de la bibliothèque D'aide à la conception. J'ai activé le drapeau de gradle
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
j'utilise la version 23.0.2 de build tools, mais je n'obtiens toujours pas d'exception de ResourcesNotFound sur kitkat ou plus bas.
il se produit lorsque j'utilise android:drawableLeft
ou imageView.setImageResource(R.drawable.drawable_image)
Et oui je suis en train de mettre ce sur chaque activité où je suis en utilisant un drawable
static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}
est-ce un bug du une bibliothèque de soutien ?
11 réponses
il m'a fallu trois choses distinctes pour que cela fonctionne en utilisant la bibliothèque de soutien 23.4.0:
-
ajouter ceci à construire.Grad
defaultConfig { vectorDrawables.useSupportLibrary = true }
-
ajouter ce qui suit à la catégorie de demande
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
-
pour toutes les vues xml dans lesquelles vous définissez un vecteur tirant remplacer
android:src
avec
app:srcCompat
et dans le code remplacer par ce qui suit:
imageView.setImageResource(...);
avec
imageView.setImageDrawable(...);
pour compléter certaines des réponses ici: le support rétrocompatible pour les VectorDrawables a un prix et ne fonctionne pas dans tous les cas .
dans quels cas fonctionne-t-il? J'ai fait ce diagramme pour aider (valide pour la bibliothèque de soutien 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 juste vos tirables vectoriels en utilisant Vectorrawablecompat et tout est prêt.
nous avions le même problème. Les tirables vectoriels n'étaient pas visibles sur Kitkat. J'ai résolu ce problème en ajoutant AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
à la méthode oncrée des activités.
avant cela n'oubliez pas d'ajouter:
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
et appelez setImageResource pour la vue que vous utilisez le vecteur dessiné. Mon point de vue est ImageButton. J'ai Android SDK construire des outils version 23.0.3
Désolé d'être en retard à la partie, mais cette réponse peut aider les utilisateurs qui veulent activer le drapeau AppCompatDelegate.setcompatvectorfromressenabled (true); pour toutes les activités.
1. Créer une classe qui s'étend à L'Application (android.App.Application)
public class MyApplicationClass extends Application
{
@Override
public void onCreate()
{
super.onCreate();
}
}
2. Sur la tête de Manifeste.xml et ajouter la ligne suivante à votre étiquette
<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. Ajouter le code 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 ma classe de demande.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();
}
}
Support pour les tirables vectoriels dans des endroits comme android:drawableLeft
a été désactivé dans la bibliothèque de soutien 23.3. Il a été annoncé sur Google+ :
nous avons décidé de supprimer la fonctionnalité qui vous permet d'utiliser vector possibilité de puiser dans les ressources sur les dispositifs pré-Lollipop en raison de problèmes dans la mise en œuvre dans la version 23.2.0/23.2.1. Utiliser app: srcccompat et setImageResource() continue à travailler.
Liens aux questions:
- https://code.google.com/p/android/issues/detail?id=205236
- https://code.google.com/p/android/issues/detail?id=204708
cependant, si vous pouvez vivre avec ces problèmes, dans 23.4 vous pouvez réactiver cette fonctionnalité en utilisant AppCompatDelegate.setcompatvectorfromressenabled () .
si vous êtes curieux de savoir comment cela fonctionne, la meilleure personne à apprendre est Chris Banes, qui a écrit cette fonctionnalité. Il explique en détail sur son blog .
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
utilisez ceci dans app.Grad
puis utilisez AppCompatDrawableManager
pour définir drawable et getDrawable. Travaille pour moi
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"
j'ai eu un problème similaire il y a longtemps, il n'a pas fonctionné en mettant
vectorDrawables.useSupportLibrary = true
n'a fonctionné que lorsque j'ai créé le dossier "mipmap", et le code utilisé
imageView.setImageResource (R.mipmap.drawable_image)
il a plus D'information ici
`VectorDrawable`
et `AnimatedVectorDrawable`
dans cette bibliothèque de soutien peut être gonflé de cette façon:
- Appel statique
getDrawable()
méthodes:
//This will only inflate a drawable with <vector> as the root element VectorDrawable.getDrawable(context, R.drawable.ic_arrow_vector); //This will only inflate a drawable with <animated-vector> as the root element AnimatedVectorDrawable.getDrawable(context, R.drawable.ic_arrow_to_menu_animated_vector); // This will inflate any drawable and will auto-fallback to the lollipop implementation on api 21+ devices ResourcesCompat.getDrawable(context, R.drawable.any_drawable);
si vous gonflez le Drawable en code java, il est recommandé de toujours utiliser ResourcesCompat.getDrawable()
comme cela gère Lollipop repli le cas échéant. Cela permet au système de mettre en cache ConstantState dessinable et est donc plus efficace.
La bibliothèque possède les animations morph (bi-directionnelles) suivantes:
Comme vous pouvez voir, j'ai produit l'image ci-dessus sur mon
API 16
téléphone: 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 corrigera votre problème (jusqu'à API 14
) si vous le fusionnez avec votre module app build.gradle
dependencies
(habituellement à 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'
}
ne mettez pas vos vecteurs dans drawable-anydpi
, vieux appareils ne supporte pas que
mettez-les dans drawable