web-dev-qa-db-fra.com

Bibliothèque de support VectorDrawable Resources $ NotFoundException

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?

58
Arka

Il a fallu 3 choses distinctes pour que cela fonctionne avec la bibliothèque de support 23.4.0:

  1. Ajouter ceci à build.gradle

    defaultConfig {
        vectorDrawables.useSupportLibrary = true
    }
    
  2. Ajouter ce qui suit à onCreate de votre classe d'application

    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
    
  3. 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(...);
    
61
Rich Luick

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

 VectorDrawable cheatsheet

50
David Ferrand

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.

26
Andrei Lupsa

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

23
Murat

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();
    }
}
11
zackygaurav
defaultConfig {
  vectorDrawables.useSupportLibrary = true
}

utiliser ceci dans app.gradle

Puis utilisez AppCompatDrawableManager pour définirDrawable et getDrawable. Travaille pour moi

8
emilpmp

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 .

7
Marcin Koziński

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
jmarkstar

Ne mettez pas vos vecteurs dans drawable-anydpi , Les anciens appareils ne supportent pas cela

mettez-les dans drawable

1
sajad

 API 16 animation
Dessins gonflables

`VectorDrawable` et `AnimatedVectorDrawable` dans cette bibliothèque de support peuvent être gonflés de la manière suivante:

  • Appel de méthodes 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:

  • Animation de morph-play 
  • Animation de morphing Play-Stop 
  • Animation du menu Arrow-Hamburger 

  • Comme vous pouvez le constater, j'ai créé l'image ci-dessus sur mon téléphone 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.gradledependencies 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'
    }
    
    1
    Jon Goodwin

    Utilisez AppCompatImageView au lieu de ImageView comme le dit Harish Gyanani dans les commentaires, cela fonctionne très bien avec cela pour moi.

    Documents officiels

    0
    Krishna

    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.

    0
    emirua