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 ?

51
demandé sur Arka 2016-06-03 16:17:37

11 réponses

il m'a fallu trois choses distinctes pour que cela fonctionne en utilisant la bibliothèque de soutien 23.4.0:

  1. ajouter ceci à construire.Grad

    defaultConfig {
        vectorDrawables.useSupportLibrary = true
    }
    
  2. ajouter ce qui suit à la catégorie de demande

    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
    
  3. 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(...);
    
52
répondu Rich Luick 2016-06-16 16:20:56

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).

VectorDrawable cheatsheet

42
répondu David Ferrand 2017-01-25 15:57:47

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.

23
répondu Andrei Lupsa 2016-12-08 08:11:31

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

22
répondu Murat 2016-06-05 16:11:21

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();
    }
}
11
répondu zackygaurav 2018-01-10 11:46:25

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:

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 .

6
répondu Marcin Koziński 2016-06-05 16:31:49
defaultConfig {
  vectorDrawables.useSupportLibrary = true
}

utilisez ceci dans app.Grad

puis utilisez AppCompatDrawableManager pour définir drawable et getDrawable. Travaille pour moi

6
répondu emilpmp 2017-01-17 14:20:49

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"
4
répondu jmarkstar 2016-06-03 13:24:29

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

1
répondu Marco Giovanni 2017-05-23 12:10:33

API 16 animation

Gonfler Drawable

`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:

  • Play-Pause animation de morphing
  • Play-Stop animation de morphing
  • Flèche-Hamburger menu animation de morphing


  • 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'
    }
    
    1
    répondu Jon Goodwin 2017-01-01 20:33:14

    ne mettez pas vos vecteurs dans drawable-anydpi , vieux appareils ne supporte pas que

    mettez-les dans drawable

    0
    répondu sajad 2017-11-15 06:21:07