74 votes

Bibliothèque de prise en charge VectorDrawable Ressources$NotFoundException

Je suis à l'aide de Support à la Conception de version de Bibliothèque 23.4.0. J'ai activé l'gradle drapeau:

defaultConfig {
    vectorDrawables.useSupportLibrary = true
}

Je suis à l'aide d'outils de compilation de la version 23.0.2, mais encore, je reçois Resources$NotFoundException sur KitKat ou moins.

Il est survenu lorsque j'utilise android:drawableLeft ou imageView.setImageResource(R.drawable.drawable_image).

Et oui, je suis en train de monter ce sur chaque activité où je suis en utilisant un drawable

static {
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}

Est-ce un bug de la bibliothèque de prise en charge?

89voto

Rich Luick Points 1464

Il a fallu 3 la part des choses pour moi à obtenir que cela fonctionne avec le soutien de la bibliothèque 23.4.0:

  1. Ajouter à construire.gradle

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

    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
    
  3. Pour toutes les vues xml dans lequel vous mettez un vecteur dessiné remplacer

    android:src
    

    avec

    app:srcCompat
    

    et dans le code de remplacer ce:

    imageView.setImageResource(...);
    

    avec

    imageView.setImageDrawable(...);
    

65voto

David Ferrand Points 3646

Pour compléter certaines réponses ici: backward-compatible support pour VectorDrawables vient avec un prix et ne fonctionne pas dans tous les cas.

Dans quels cas faut-il travailler? J'ai fait ce schéma à l'aide (valable pour le Soutien de la Bibliothèque 23.4.0 au moins 25.1.0).

VectorDrawable cheatsheet

32voto

Andrei Lupsa Points 2151

Essayez d'utiliser:

imageView.setImageDrawable(VectorDrawableCompat.create(getResources(), drawableRes, null));

Vous n'avez pas à ajouter de l' AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); de cette façon.

Il suffit de gonfler votre vecteur un drawable à l'aide de VectorDrawableCompat et vous êtes tous ensemble.

25voto

Murat Points 670

Nous avons eu le même problème. Vecteur d'un drawable n'étaient pas visibles sur Kitkat. J'ai résolu ce problème en ajoutant AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); pour la méthode onCreate d'Activités.

Avant que n'oubliez pas d'ajouter:

defaultConfig {
    vectorDrawables.useSupportLibrary = true
}

et appel setImageResource pour la vue que vous utilisez le vecteur dessiné. De mon point de vue est ImageButton. J'ai version du SDK Android version des outils de 23.0.3

15voto

zackygaurav Points 2581

Désolé pour le retard à la fête, mais cette réponse peut aider les utilisateurs qui veulent activer le drapeau AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); pour toutes les activités.

1. Créer une classe qui étend l'Application (android.app.Demande)

public class MyApplicationClass extends Application
{
    @Override
    public void onCreate()
    {
        super.onCreate();
    }
}

2. Sur la tête de 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 au-dessus de 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();
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X