13

Quando si lavora con Android> = 5.0,Android Support Library: getDrawable indipendente se vettore o no

Drawable d = getResources().getDrawable(R.drawable.icon) 

analizza correttamente il codice XML e restituisce un disegnabile valida. Ma quando si utilizza il nuovo Vector Drawable Support Library (Versione 23.4, Gradle 2.1.2), questo codice si arresta in modo anomalo in Android 4.

android.content.res.Resources $ NotFoundException

...

Causato da: org.xmlpull.v1.XmlPullParserException: linea di file XML Binary # 2: non valida drawable tag vettore

La soluzione sarebbe quella di utilizzare

Drawable d = VectorDrawableCompat.create(getResources(), R.drawable.icon, null); 

Ma questo si blocca se la risorsa non è una risorsa vettore:

java.io.FileNotFoundException: file binario XML corrotto

Così che cosa codice deve essere usato al posto della prima riga in modo che funziona con Android 4 e Android 6 e con drawable vettoriali e non vettoriali - ad es in tutte le circostanze questa linea è stata utilizzata in un progetto Android 5.0+? L'articolo della libreria di supporto non menziona un modo per eseguire questa migrazione

+0

presumo che si aspettavano gli sviluppatori di sapere in anticipo se la risorsa è un vettore disegnabile o meno. Questo è ragionevole per gli sviluppatori di app, meno per gli sviluppatori di librerie. A prima vista, proverei il 'VectorDrawableCompat', e tornerò a' getDrawable() 'se ottieni un' FileNotFoundException'. – CommonsWare

risposta

4

Ho trovato la soluzione.

È necessario aggiungere manualmente il supporto VectorDrawable nella propria attività.

provare questo nella vostra attività:

static { 
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); 
} 

si dovrebbe verificare questa blog entry per ulteriori informazioni.

+4

Grazie, ha funzionato. Per vostra informazione, è '' setCompatVectorFromResourcesEnabled() ', il post del blog ha un errore di battitura. – PhilLab

30

È possibile utilizzare il seguente metodo per ottenere drawable di Vector Drawable in pre 5.0.

Drawable drawable = AppCompatResources.getDrawable(mContext, mImageTitleResId); 
+0

Disponibile in supporto lib 24.2.x. –

+0

Grazie mille! Ci ha aiutato a correggere un crash che si riproduceva sempre nella nostra app mentre utilizzavamo drawable vettoriali su dispositivi pre 5.0. –

+0

Questa dovrebbe essere la risposta. – Sakiboy

1

un'altra soluzione possibile quello che ho trovato finora

ResourcesCompat.getDrawable(context.resources, resId, theme) 

e il contesto dovrebbe essere la vostra attività (ma non contesto di applicazione)