InflateException con FloatingActionButton dalla libreria di progettazione ufficiale


88

Ricevo un bug utilizzando il funzionario FloatingActionButtondalla libreria di progettazione di supporto di Google.

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 alla mia app è dove gonfia il xmlfile 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" />

Informazioni extra:

Ecco il tema della mia app:

<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 file AppCompatActivity.

Ho notato che sto usando una versione precedente di appcompat:

com.android.support:appcompat-v7:22.1.1

Questo sembra essere aggiornato:

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

Anche,

minSdkVersion 16
targetSdkVersion 22

Ora, GONEin alcuni casi imposto la visibilità su per il mio FAB, ma questo è dopo che si è gonfiato, quindi non può essere il problema.

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

È un bug noto o forse sto facendo qualcosa di sbagliato?


5
android:backgroundTintpotrebbe essere fastidioso sui dispositivi pre lollipop. Usa app:backgroundTintinvece. Tuttavia, non posso segnalare alcun problema per 5.0.
Markus Rubey

@MarkusRubey Thanks. Vale la pena cambiare. L'ho modificato e aggiornato la mia libreria appCompat in Gradle e ho verificato se questo risolve il problema. So che non si è mai bloccato su un dispositivo o un emulatore pre 5.0 per me quando stavo testando anche se avevo quella tinta. Ma non tutti i dispositivi sono creati uguali ...
TheLettuceMaster

1
@MarkusRubey, credo che sia stato il tuo commento a risolvere questo problema. Un problema con la colorazione che penso sia compatibile per 5.1 in su a meno che non usi appcome dici tu. Sentiti libero di aggiungerlo come risposta.
TheLettuceMaster

Risposte:


225

com.android.support:appcompat-v7:21+aggiunto il supporto per i widget di colorazione sui dispositivi che eseguono versioni precedenti ad Android 5.1 (livello API 21). Per utilizzarlo assicurati di estendere o impostare il AppCompattema e utilizzare app:backgroundTintinvece di 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" />

5
Si noti che il supporto backgroundTint è stato aggiunto nell'API 21 (Android 5.0): developer.android.com/reference/android/… Quindi, secondo le specifiche, dovresti essere in grado di utilizzare backgroundTint in Android 5.0 senza la libreria di supporto. In pratica, sembra andare in crash ed è necessario utilizzare la libreria di supporto per farlo funzionare. Ho solo pensato di menzionarlo per chiunque altro confuso sul perché un'API etichettata come v21 nella documentazione dello sviluppo non funziona effettivamente fino alla v22; sembra essere un bug.
OldSchool4664

50

Basta sostituire

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

per

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

3
Non dimenticare di aggiungere lo spazio dei nomi xmlns: app = " schemas.android.com/apk/res-auto "!
Sev

il problema nel mio caso era l'impostazione dello sfondo con l'attributo android: background. Sostituisci con l'app: backgroundTint ha risolto il problema
Andrey Kolesnikov

13

Se stai usando un VectorDrawableCompat(asset vettoriale) dovresti usare:

app:srcCompat="@drawable/x"

invece di:

android:src="@drawable/x"

7

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

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

3

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

Per un modo ordinato di gestirlo in progetti multimodulo, vedere: In Gradle, come si dichiarano le dipendenze comuni in un unico posto?


3

Basta passare androida app:

android:backgroundTint="@color/accent"

Per:

app:backgroundTint="@color/accent"

2
Benvenuto in Stack Overflow! Le immagini e gli screenshot possono essere una bella aggiunta a un post, ma assicurati che il post sia ancora chiaro e utile senza di essi. Non pubblicare immagini di codici o messaggi di errore. Leggi perché . Invece copia e incolla o digita il codice / messaggio effettivo direttamente nel post.
Filnor

0

nel mio caso, è stato a causa della falsa configurazione del tema dell'attività. il problema è stato risolto dopo aver cambiato il tema dell'app in Theme.AppCompat.xxx.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.