41

Uso la libreria di supporto di progettazione versione 23.4.0. Ho permesso la bandiera Gradle

defaultConfig { 
    vectorDrawables.useSupportLibrary = true 
} 

Sto usando costruire versione 23.0.2 strumenti, ma ancora sto ottenendo eccezione ResourcesNotFound su KitKat o inferiore.

Si sta verificando quando uso android:drawableLeft o imageView.setImageResource(R.drawable.drawable_image)

E sì sto mettendo questo su tutte le attività in cui sto usando drawable

static { 
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); 
} 

Questo è un bug della libreria di supporto?

+2

di fronte lo stesso problema, come si .did hai qualsiasi soluzione per Android: drawableLeft? – Sayem

+1

@Sayem No.Ho dovuto rimuovere del tutto l'immagine dal pulsante. Sebbene tu possa fornire png separati come disegnabili. – Arka

+0

sì .. ho già fatto lo stesso del tuo suggerimento. – Sayem

risposta

3

cambiamento

imageView.setImageResource(R.drawable.drawable_image) 

a

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

se si desidera utilizzare vectordrawable in xml, utilizzare questo:

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

Il metodo setImageDrawable funziona. Ma ancora drawable Button non funziona. – Arka

+0

Ciò provoca l'arresto anomalo dei dispositivi più vecchi. –

+0

Questo non funziona. Usa invece una delle altre risposte qui. – Sakiboy

1

Ho avuto un problema simile tempo fa, non ha lavoro impostando

vectorDrawables.useSupportLibrary = true

funzionava solo quando ho creato la cartella "mipmap", e il codice utilizzato

imageView.setImageResource (R.mipmap.drawable_image)

Ha più informazioni here

22

Abbiamo avuto lo stesso problema. I drawable vettoriali non erano visibili su Kitkat. Ho risolto questo problema aggiungendo AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); al metodo onCreate di Attività.

Prima di allora non dimenticate di aggiungere:

defaultConfig { 
    vectorDrawables.useSupportLibrary = true 
} 

e chiamare setImageResource per la vista che si utilizza drawable vettoriale. La mia vista è ImageButton. Ho degli strumenti di sviluppo per Android SDK versione 23.0.3

+2

Il mio problema è che anche 'AppCompatDelegate.setCompatVectorFromResourcesEnabled (true);' non funziona. La stessa eccezione ResourceNotFound. – Arka

+0

@Arka si può provare a chiamare il metodo onCreate di Attività. – Murat

+1

Dovresti essere in grado di aggiungerlo alla classe di applicazione onCreate. Sembra che funzioni per me. –

5

Il supporto per i drawable vettoriali in posti come android:drawableLeft era disabilitato nella libreria di supporto 23.3. È stato annunciato il Google+:

abbiamo deciso di rimuovere la funzionalità che consentono di utilizzare vettore drawable da risorse su dispositivi pre-lecca a causa di problemi trovato nell'attuazione nella versione 23.2.0/23.2. 1. Utilizzando app: srcCompat e setImageResource() continua a funzionare.

Link a questioni:

Tuttavia, se si può vivere con questi problemi, in 23.4 è possibile riattivare questa funzionalità utilizzando AppCompatDelegate.setCompatVectorFromResourcesEnabled().

Se sei curioso di sapere come funziona, la persona migliore da cui imparare è Chris Banes, autore di questa funzionalità. Spiega in dettaglio on his blog.

41

ci sono voluti 3 cose separate per me per arrivare a questo lavoro utilizzando libreria di supporto 23.4.0:

  1. Aggiungi questo al build.gradle

    defaultConfig { 
        vectorDrawables.useSupportLibrary = true 
    } 
    
  2. aggiungere quanto segue onCreate di la tua classe di applicazione

    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); 
    
  3. Per tutte le visualizzazioni xml in cui sei impostato ing un vettore drawable sostituire

    android:src 
    

    con

    app:srcCompat 
    

    e nel codice sostituire questo:

    imageView.setImageResource(...); 
    

    con

    imageView.setImageDrawable(...); 
    
+0

si applica anche se la mia attività è basata su AppCompatActivity? AppCompatActivity utilizza già AppCompatDelegate. – Thupten

+0

Basta usare 'AppCompatImageView' invece di' ImageView'. Problema risolto. Non c'è bisogno di tenere le PNG per le versioni inferiori. Anche 'srcCompat' non è necessario. –

+0

Ho eseguito i passaggi da 1 a 3 (nel 3 ° passo è stata utilizzata l'app: srcCompat). Tuttavia, vedo ancora un'eccezione 'XmlPullParserException: linea di file XML binario # 4: vector tag drawable non valido'. Sembra che il tag 'vector' nell'XML non sia riconosciuto su questo dispositivo KitKat? –

17

Provare a utilizzare:

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

Non è necessario aggiungere AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); in questo modo.

Basta gonfiare i file vettoriali con VectorDrawableCompat e tutto è pronto.

+2

Questo ha 2 arg invece di 3: 'AppCompatDrawableManager.get(). GetDrawable (context, resId);' –

1

API 16 animation
gonfiaggio del

`VectorDrawable` e `AnimatedVectorDrawable` in questa libreria di supporto può essere gonfiato in questo modo Drawable:

  • Calling statici getDrawable() metodi:
//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);

Se si gonfia il Drawable in codice java, si consiglia di utilizzare sempre ResourcesCompat.getDrawable() poiché questo gestisce il fallback di Lollipop quando applicabile. Ciò consente al sistema di memorizzare nella cache la costante ConstantState e quindi è più efficiente.
La biblioteca ha la seguente Morph (bi-direzionale) animazioni:

  • Play-Pause morph animazione
  • Play-stop morph animazione
  • Arrow-Hamburger menù morph animazione

  • come si può vedo, ho prodotto l'immagine qui sopra sul mio API 16 telefono:

    import com.wnafee.vector.compat.AnimatedVectorDrawable; 
    mdrawable = (AnimatedVectorDrawable) AnimatedVectorDrawable.getDrawable(this.getApplicationContext(), R.drawable.consolidated_animated_vector); 
    

    sguardo al github README per vector-compat qui:

    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
    : https://github.com/wnafee/vector-compat
    Ciò risolverà il vostro problema (fino a API 14) se si uniscono con del build.gradle dependencies (di solito alla fine del file) il modulo app
    defaultConfig { 
        vectorDrawables.useSupportLibrary = true 
    } 
    

    uso questo app.gradle

    Quindi utilizzare AppCompatDrawableManager a setDrawable e getDrawable. Funziona per me

    32

    Per completare alcune delle risposte qui: il supporto compatibile con le versioni precedenti di VectorDrawables viene fornito con un prezzo e non funziona in tutti i casi.

    In quali casi funziona? Ho aiutato lo this diagram (valido per Support Library 23.4.0 ad almeno 25.1.0).

    VectorDrawable cheatsheet

    +0

    NON funziona con 'setImageResource' per KitKat (4.4.4) (e inferiore credo), solo questo funziona su https://stackoverflow.com/a/35918375/7767664 – user924

    0

    Non mettere i vettori in drawable-anydpi non più in uso non supporta che

    metterli in drawable

    1

    Ci scusiamo per il ritardo alla festa, ma questa risposta può aiutare gli utenti che vuoi abilitare il flag AppCompatDelegate.setCompatVectorFromResourcesEnabled (true); per tutte le attività.

    1. Creare una classe che si estende a Application (android.app.Application)

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

    2. oltre al capo manifest.XML e aggiungere la seguente riga al 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. Aggiungere il seguente codice sopra onCreate in MyApplicationClass.java

    // This flag should be set to true to enable VectorDrawable support for API < 21 
    static 
    { 
        AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); 
    } 
    

    codice completo per 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(); 
        } 
    }