41

J'utilise la bibliothèque de support de conception version 23.4.0. J'ai activé le drapeau gradle

defaultConfig { 
    vectorDrawables.useSupportLibrary = true 
} 

J'utilise construire la version des outils 23.0.2, mais je me faire exception ResourcesNotFound sur KitKat ou moins.

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

Et oui je mets cela sur toutes les activités où je me sers dessinables

static { 
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); 
} 

Est-ce un bug de la bibliothèque de soutien?

+2

face même problème que vous vous .did avez une solution pour Android: drawableLeft? – Sayem

+1

@Sayem No.J'ai dû supprimer complètement le graphique du bouton. Bien que vous puissiez fournir un png séparé comme drawable. – Arka

+0

oui .. je l'ai déjà fait comme votre suggestion. – Sayem

Répondre

3

changement

imageView.setImageResource(R.drawable.drawable_image) 

à

imageView.setImageDrawable(ContextCompat.getDrawable(getContext(), R.drawable.drawable_image)); 

si vous souhaitez utiliser vectordrawable en xml, utilisez ceci:

app:srcCompat="@drawable/drawable_image" 
+0

Votre méthode setImageDrawable fonctionne. Mais encore bouton drawableLeft ne fonctionne pas. – Arka

+0

Cela provoque le blocage sur les périphériques plus anciens. –

+0

Cela ne fonctionne pas. Utilisez l'une des autres réponses ici à la place. – Sakiboy

1

J'ai eu un problème similaire il y a longtemps, il n'a pas travailler en réglant

vectorDrawables.useSupportLibrary = true

ne fonctionnait quand j'ai créé le dossier "mipmap", et le code utilisé

imageView.setImageResource (R.mipmap.drawable_image)

Il a plus d'infos here

22

Nous avons eu le même problème. Les drawables vectoriels n'étaient pas visibles sur Kitkat. J'ai résolu ce problème en ajoutant AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); à la méthode onCreate d'activités.

Avant que n'oubliez pas d'ajouter:

defaultConfig { 
    vectorDrawables.useSupportLibrary = true 
} 

et appelez setImageResource pour la vue que vous utilisez le vecteur drawable. Ma vue est ImageButton. J'ai des outils de développement Android SDK version 23.0.3

+2

Mon problème est que même 'AppCompatDelegate.setCompatVectorFromResourcesEnabled (true);' ne fonctionne pas. La même exception ResourceNotFound. – Arka

+0

@Arka vous pouvez essayer d'appeler la méthode onCreate des activités. – Murat

+1

Vous devriez pouvoir l'ajouter à la classe onCreate de votre application. Cela semble fonctionner pour moi. –

5

La prise en charge des tirages vectoriels dans des endroits comme android:drawableLeft a été désactivée dans la bibliothèque de support 23.3. Il a été annoncé sur Google+:

nous avons décidé de supprimer la fonctionnalité qui vous permet d'utiliser vecteur dessinables des ressources sur les appareils pré-Lollipop en raison de problèmes rencontrés dans la mise en œuvre dans la version 23.2.0/23.2. 1. L'utilisation de l'application: srcCompat et setImageResource() continue de fonctionner.

Liens vers les questions:

Cependant, si vous pouvez vivre avec ces problèmes, à 23.4 vous pouvez réactiver cette fonctionnalité à l'aide AppCompatDelegate.setCompatVectorFromResourcesEnabled().

Si vous êtes curieux de savoir comment cela fonctionne, la meilleure personne à apprendre est Chris Banes, qui a créé cette fonctionnalité. Il explique en détail on his blog.

41

Il a fallu 3 choses distinctes pour moi d'obtenir ce travail en utilisant la bibliothèque de soutien 23.4.0:

  1. Ajouter à ce 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 êtes défini ing un vecteur étirable remplacer

    android:src 
    

    avec

    app:srcCompat 
    

    et dans le code de remplacer celle-ci:

    imageView.setImageResource(...); 
    

    avec

    imageView.setImageDrawable(...); 
    
+0

s'applique-t-il même si mon activité est basée sur AppCompatActivity? AppCompatActivity utilise déjà AppCompatDelegate. – Thupten

+0

Utilisez simplement 'AppCompatImageView' au lieu de' ImageView'. Problème résolu. Pas besoin de garder pngs pour les versions inférieures. Même 'srcCompat' n'est pas nécessaire. –

+0

J'ai fait les étapes 1 à 3 (sur la 3ème étape utilisée 'app: srcCompat'). Cependant, je vois toujours une exception 'XmlPullParserException: ligne de fichier XML binaire # 4: vecteur de tag drawable invalide'. Il semble que la balise 'vector' dans le fichier XML n'est pas reconnue sur ce périphérique KitKat? –

17

Essayez d'utiliser:

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

Vous ne devez pas ajouter AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); cette façon. Il suffit de gonfler vos tirables vectoriels en utilisant VectorDrawableCompat et vous êtes tous ensemble.

+2

Cela a 2 args au lieu de 3: 'AppCompatDrawableManager.get(). GetDrawable (contexte, resId);' –

1

API 16 animation
Gonflage Drawable de

`VectorDrawable` et `AnimatedVectorDrawable` dans cette bibliothèque de soutien peut être gonflé de cette manière:

  • Appel getDrawable() méthodes statiques:
//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 code Drawable en Java, il est recommandé de toujours utiliser ResourcesCompat.getDrawable() car il gère le repli Lollipop le cas échéant. Cela permet au système de mettre en cache DrawStableState et est donc plus efficace.
La bibliothèque a des animations morph (bi-directionnel) suivant:

  • Play-Pause Morph animation
  • Lecture-Stop animation morph
  • Menu Arrow-Hamburger animation morph

  • Comme vous pouvez voir, je produisais 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 va corriger votre problème (jusqu'à API 14) si vous fusionnez avec votre build.gradledependencies (généralement à la fin du fichier) du module d'application:

    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' 
    } 
    
    6
    defaultConfig { 
        vectorDrawables.useSupportLibrary = true 
    } 
    

    utiliser dans app.gradle

    utilisez ensuite AppCompatDrawableManager à setDrawable et getDrawable. Fonctionne pour moi

    32

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

    Dans quels cas cela fonctionne-t-il? J'ai fait this diagram pour aider (valide pour Support Library 23.4.0 à au moins 25.1.0).

    VectorDrawable cheatsheet

    +0

    Cela ne fonctionne PAS avec 'setImageResource' pour KitKat (4.4.4) (et plus bas je suppose), seulement ceci fonctionne https://stackoverflow.com/a/35918375/7767664 – user924

    0

    Ne mettez pas vos vecteurs drawable-anydpi , les anciens appareils ne supporte pas que

    les mettre dans drawable

    1

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

    1. Créez une classe qui étend à la demande (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 au-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(); 
        } 
    }