InflateException mit FloatingActionButton aus der offiziellen Designbibliothek

88

Ich erhalte einen Fehler beim Verwenden des Beamten FloatingActionButtonaus der Support-Designbibliothek von Google.

Hier ist mein 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

Die einzige Zeile, die auf meine App zeigt, ist die Stelle, an der die xmlDatei aufgeblasen wird, und die Zeile in der Datei, die meine ist 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" />

Zusatzinformation:

Hier ist mein App-Thema:

<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>

Ja, ich benutze eine AppCompatActivity.

Mir ist aufgefallen, dass ich eine ältere Version von appcompat verwende:

com.android.support:appcompat-v7:22.1.1

Dies scheint auf dem neuesten Stand zu sein:

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

Ebenfalls,

minSdkVersion 16
targetSdkVersion 22

Jetzt stelle ich die Sichtbarkeit GONEfür mein FAB in einigen Fällen ein, aber dies erfolgt nach dem Aufblasen, sodass dies nicht das Problem sein kann.

Dies funktioniert nun mit meinem 5.1-Gerät, aber die Benutzer, die Probleme haben, haben 5.0.

Ist das ein bekannter Fehler oder mache ich etwas falsch?

TheLettuceMaster
quelle
5
android:backgroundTintkönnte auf Geräten vor dem Lutscher problematisch sein. Verwenden Sie app:backgroundTintstattdessen. Ich kann jedoch keine Probleme für 5.0 aufzeigen.
Markus Rubey
@ MarkusRubey Danke. Das ist eine Änderung wert. Ich habe das geändert und meine appCompat-Bibliothek in Gradle aktualisiert und überprüft, ob das Problem dadurch behoben wird. Ich weiß, dass es beim Testen auf einem Gerät oder Emulator vor 5.0 für mich nie abgestürzt ist, obwohl ich diesen Farbton hatte. Aber nicht alle Geräte sind gleich ...
TheLettuceMaster
1
@ MarkusRubey Ich glaube, es war Ihr Kommentar, der dieses Problem behoben hat. Ein Problem mit der Tönung, das meiner Meinung nach mit 5.1 kompatibel ist, es sei denn, Sie verwenden, appwie Sie sagen. Fühlen Sie sich frei, es als Antwort hinzuzufügen.
TheLettuceMaster

Antworten:

225

com.android.support:appcompat-v7:21+Unterstützung für das Abtönen von Widgets auf Geräten mit Android 5.1 (API Level 21) hinzugefügt. Um es zu nutzen, stellen Sie sicher, dass Sie das AppCompatThema erweitern oder festlegen und app:backgroundTintstattdessen verwenden android:backgroundTint.

Beispiel:

<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" />
Markus Rubey
quelle
5
Beachten Sie, dass die Unterstützung für backgroundTint in API 21 (Android 5.0) hinzugefügt wurde: developer.android.com/reference/android/… Entsprechend der Spezifikation sollten Sie backgroundTint in Android 5.0 ohne die Unterstützungsbibliothek verwenden können. In der Praxis scheint es abzustürzen, und Sie müssen die Support-Bibliothek verwenden, damit es funktioniert. Ich dachte nur, ich würde dies für alle anderen erwähnen, die verwirrt sind, warum eine API, die in der Entwicklerdokumentation als v21 gekennzeichnet ist, erst in Version 22 funktioniert. es scheint ein Fehler zu sein.
OldSchool4664
50

Einfach ersetzen

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

zu

<android.support.design.widget.FloatingActionButton 
...
...
app:backgroundTint
/>
Abhijeet Mallick
quelle
3
Vergessen Sie nicht, den Namespace xmlns : app = " schemas.android.com/apk/res-auto " hinzuzufügen !
Sev
Problem in meinem Fall war das Einstellen des Hintergrunds mit dem Attribut android: background. Durch App ersetzen: backgroundTint hat das Problem gelöst
Andrey Kolesnikov
13

Wenn Sie ein VectorDrawableCompat(Vektor-Asset) verwenden, sollten Sie Folgendes verwenden:

app:srcCompat="@drawable/x"

anstatt:

android:src="@drawable/x"
Ab ِ
quelle
7

Ich hatte das gleiche Problem und versuchte eine andere Lösung. Aber das, was für mich funktioniert hat, war sicherzustellen, dass die Versionen der Appcompat- und Design-Support-Bibliothek identisch sind. beispielsweise:

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

Eine andere Möglichkeit, diese Nachricht zu erhalten, besteht darin, versehentlich verschiedene Versionen der Appcompat-Bibliothek in verschiedenen Modulen angegeben zu haben. Dies ist wahrscheinlich der Fall, wenn Sie ein neues Modul erstellen, da Android Studio standardmäßig die aktuellste Version verwendet.

Eine übersichtliche Methode zur Verwaltung in Projekten mit mehreren Modulen finden Sie unter: Wie deklariere ich in Gradle allgemeine Abhängigkeiten an einem einzigen Ort?

ehartwell
quelle
3

Wechseln Sie einfach androidzu app:

android:backgroundTint="@color/accent"

Zu:

app:backgroundTint="@color/accent"
G.Alima
quelle
2
Willkommen bei Stack Overflow! Bilder und Screenshots können eine schöne Ergänzung zu einem Beitrag sein, aber stellen Sie bitte sicher, dass der Beitrag ohne sie noch klar und nützlich ist. Veröffentlichen Sie keine Bilder mit Code oder Fehlermeldungen. Lesen Sie warum . Kopieren Sie stattdessen den eigentlichen Code / die Nachricht und geben Sie sie ein oder geben Sie sie direkt in den Beitrag ein.
Filnor
0

In meinem Fall lag es an der falschen Konfiguration des Aktivitätsthemas. Das Problem wurde behoben, nachdem ich das App-Thema in Theme.AppCompat.xxx geändert hatte.

Stevens
quelle