60

Sto riscontrando un bug utilizzando lo FloatingActionButton ufficiale dalla libreria di progettazione di supporto di Google.InflateException con FloatingActionButton dalla Libreria di progettazione ufficiale

Ecco il mio LogCat.

android.view.InflateException: Binary XML file line #34: Error inflating class android.support.design.widget.FloatingActionButton 
at android.view.LayoutInflater.createView(LayoutInflater.java:633) 
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:743) 
at android.view.LayoutInflater.rInflate(LayoutInflater.java:806) 
at android.view.LayoutInflater.rInflate(LayoutInflater.java:809) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:504) 
at de.robv.android.xposed.XposedBridge.invokeOriginalMethodNative(Native Method) 
at de.robv.android.xposed.XposedBridge.handleHookedMethod(XposedBridge.java:655) 
at android.view.LayoutInflater.inflate(Unknown Source) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:414) 
at ---.---.com.---.SubCategoryFragment.onCreateView(SubCategoryFragment.java:47) 
at android.support.v4.app.Fragment.performCreateView(Fragment.java:1789) 
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:955) 
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1138) 
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:740) 
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1501) 
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:458) 
at android.os.Handler.handleCallback(Handler.java:739) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:135) 
at android.app.ActivityThread.main(ActivityThread.java:5221) 
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 
at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:117) 
Caused by: java.lang.reflect.InvocationTargetException 
at java.lang.reflect.Constructor.newInstance(Native Method) 
at java.lang.reflect.Constructor.newInstance(Constructor.java:288) 
at android.view.LayoutInflater.createView(LayoutInflater.java:607) 
... 24 more 
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable()' on a null object reference 
at android.graphics.drawable.LayerDrawable$ChildDrawable.<init>(LayerDrawable.java:968) 
at android.graphics.drawable.LayerDrawable$LayerState.<init>(LayerDrawable.java:1014) 
at android.graphics.drawable.RippleDrawable$RippleState.<init>(RippleDrawable.java:910) 
at android.graphics.drawable.RippleDrawable.createConstantState(RippleDrawable.java:901) 
at android.graphics.drawable.RippleDrawable.createConstantState(RippleDrawable.java:90) 
at android.graphics.drawable.LayerDrawable.mutate(LayerDrawable.java:932) 
at android.graphics.drawable.RippleDrawable.mutate(RippleDrawable.java:891) 
at android.view.View.applyBackgroundTint(View.java:16324) 
at android.view.View.setBackgroundDrawable(View.java:16193) 
at android.support.design.widget.FloatingActionButton.access$201(FloatingActionButton.java:56) 
at android.support.design.widget.FloatingActionButton$1.setBackgroundDrawable(FloatingActionButton.java:118) 
at android.support.design.widget.FloatingActionButtonLollipop.setBackgroundDrawable(FloatingActionButtonLollipop.java:75) 
at android.support.design.widget.FloatingActionButton.<init>(FloatingActionButton.java:131) 
at android.support.design.widget.FloatingActionButton.<init>(FloatingActionButton.java:79) 
... 27 more 

L'unica linea che punta al mio app è dove si gonfia il file xml, e la linea in quel file che è il mio FloatingActionButton.

<android.support.design.widget.FloatingActionButton 
     android:id="@+id/myFABSubCat" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentEnd="true" 
     android:layout_alignParentRight="true" 
     android:layout_margin="16dp" 
     android:backgroundTint="@color/accent" 
     android:src="@drawable/add_icon" 
     app:borderWidth="0dp" 
     app:elevation="4sp" /> 

Info extra:

Ecco la mia app tema:

<resources> 

    <!-- Base application theme. --> 
    <style name="MBTIAppTheme" parent="Theme.AppCompat.Light.NoActionBar"> 
     <item name="colorPrimary">@color/primary</item> 
     <item name="colorPrimaryDark">@color/primaryDark</item> 
     <item name="colorAccent">@color/accent</item> 
     <item name="android:windowContentOverlay">@null</item> 
    </style> 

    <style name="ThemeNoActionBar" parent="MBTIAppTheme"> 
     <item name="windowActionBar">false</item> 
    </style> 

</resources> 

Sì, sto usando un AppCompatActivity.

ho notato che sto usando una vecchia versione di appcompat:

com.android.support:appcompat-v7:22.1.1 

Questo sembra essere sempre aggiornato:

compile 'com.android.support:design:22.2.0' 

Inoltre,

minSdkVersion 16 
targetSdkVersion 22 

Ora, che faccio imposta la Visibilità a GONE in alcuni casi per il mio FAB, ma questo è dopo che si gonfia in modo che non possa essere il problema.

Ora, questo funziona con il mio dispositivo 5.1, ma gli utenti che hanno problemi hanno 5.0.

Si tratta di un bug noto o forse sto facendo qualcosa di sbagliato?

+3

'android: backgroundTint' potrebbe essere problematico sui dispositivi pre lollipop. Usa invece l'app: backgroundTint'. Non riesco a segnalare eventuali problemi per 5.0 però. –

+0

@MarkusRubey Grazie. Vale la pena cambiare. Ho cambiato e aggiornato la mia libreria appCompat in Gradle e controllo per vedere se questo risolve il problema. So che non è mai andato in crash su un dispositivo o emulatore pre 5.0 per me mentre stavo testando anche se avevo quella tinta. Ma non tutti i dispositivi sono creati uguali ... – KickingLettuce

+1

@MarkusRubey Credo che sia stato il tuo commento a risolvere questo problema . Un problema con la colorazione che penso sia compatibile con la versione 5.1 a meno che non si usi 'app' come dici tu. Sentiti libero di aggiungerlo come risposta. – KickingLettuce

risposta

170

com.android.support:appcompat-v7:21+ aggiunto supporto per la colorazione di widget su dispositivi con sistema operativo Android 5.1 (Livello API 21). Per utilizzarlo assicurarsi di estendere o impostare il tema AppCompat e utilizzare app:backgroundTint anziché android:backgroundTint.

Esempio:

<android.support.design.widget.FloatingActionButton 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/fab" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_margin="16dp" 
    android:src="@drawable/icon" 
    app:backgroundTint="@color/accent" 
    app:borderWidth="0dp" /> 
+3

Nota che il supporto per backgroundTint è stato aggiunto nell'API 21 (Android 5.0): http://developer.android.com/reference/android/R.attr.html#backgroundTint Quindi, secondo le specifiche, dovresti essere in grado di usa backgroundTint in Android 5.0 senza la libreria di supporto. In pratica, sembra bloccarsi e devi usare la libreria di supporto per farlo funzionare. Ho solo pensato di dire questo per chiunque altro ha confuso il motivo per cui una API etichettata come v21 nella documentazione di sviluppo non funziona fino alla v22; sembra essere un bug. – OldSchool4664

+0

Questo ha risolto il mio problema, grazie!] –

+0

Mi hai salvato la vita! –

39

Basta sostituire

<android.support.design.widget.FloatingActionButton 
... 
... 
android:backgroundTint 
/> 

a

<android.support.design.widget.FloatingActionButton 
... 
... 
app:backgroundTint 
/> 
+0

grazie, ha funzionato per me –

+3

Non dimenticare di aggiungere lo spazio dei nomi xmlns: app = "http://schemas.android.com/apk/res-auto"! Il problema – Sevren

+0

nel mio caso era impostare lo sfondo con android: attributo background. Sostituisci con app: backgroundTint ha risolto il problema –

3

Un altro modo per ottenere questo messaggio è se è stato specificato accidentalmente diverse versioni della libreria appcompat in diversi moduli . È probabile che ciò accada quando crei un nuovo modulo, dal momento che Android Studio ha come impostazione predefinita la versione più recente.

Per un modo ordinato di gestione di questo in progetti multi-modulo, vedi: In Gradle, how do I declare common dependencies in a single place?

+0

Grazie. Ha funzionato per me :) –

6

Se stai usando un (Vector risorsa) VectorDrawableCompat si dovrebbe usare:

app:srcCompat="@drawable/x" 

invece di:

android:src="@drawable/x" 

Questo ha risolto il problema per me.

5

Ho avuto lo stesso problema e ho provato una soluzione diversa. Ma quello che ha funzionato per me è stato assicurarsi che le versioni della libreria di supporto appcompat e design siano le stesse. per esempio:

compile 'com.android.support:appcompat-v7:23.2.0' 
compile 'com.android.support:design:23.2.0'