InflateException z FloatingActionButton z oficjalnej biblioteki projektów


88

Otrzymuję błąd, używając oficjalnego FloatingActionButtonz biblioteki projektów pomocy technicznej Google.

Oto mój 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

Jedyny wiersz, który wskazuje na moją aplikację, to miejsce, w którym wypełnia xmlplik, oraz wiersz w tym pliku, który jest my 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" />

Informacje dodatkowe:

Oto motyw mojej aplikacji:

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

Tak, używam AppCompatActivity.

Zauważyłem, że używam starszej wersji appcompat:

com.android.support:appcompat-v7:22.1.1

Wydaje się, że jest to aktualne:

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

Również,

minSdkVersion 16
targetSdkVersion 22

Teraz ustawiam Widoczność GONEw niektórych przypadkach dla mojego FAB, ale dzieje się to po nadmuchaniu, więc nie może to być problem.

Teraz działa to z moim urządzeniem 5.1, ale użytkownicy, którzy mają problemy, mają 5.0.

Czy to znany błąd, czy może robię coś nie tak?


5
android:backgroundTintmoże być kłopotliwe na urządzeniach sprzed wersji Lollipop. Użyj app:backgroundTintzamiast tego. Nie mogę jednak wskazać żadnych problemów w wersji 5.0.
Markus Rubey

@MarkusRubey Thanks. Warto to zmienić. Zmieniłem to i zaktualizowałem moją bibliotekę appCompat w Gradle i sprawdziłem, czy to rozwiązuje problem. Wiem, że nigdy nie zawiesił się na urządzeniu lub emulatorze starszym niż 5.0, kiedy testowałem, mimo że miałem ten odcień. Ale nie wszystkie urządzenia są takie same ...
TheLettuceMaster

1
@MarkusRubey Myślę, że to twój komentarz rozwiązał ten problem. Problem z przyciemnianiem, które moim zdaniem jest kompatybilne z wersją 5.1 i wyższą, chyba że używasz apptak, jak mówisz. Możesz go dodać jako odpowiedź.
TheLettuceMaster

Odpowiedzi:


225

com.android.support:appcompat-v7:21+dodano obsługę przyciemniania widżetów na urządzeniach z systemem starszym niż Android 5.1 (poziom API 21). Aby z niego skorzystać, należy rozszerzyć lub ustawić AppCompatmotyw i użyć app:backgroundTintzamiast android:backgroundTint.

Przykład:

<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
Zauważ, że obsługa backgroundTint została dodana w API 21 (Android 5.0): developer.android.com/reference/android/ ... Więc zgodnie ze specyfikacją powinieneś móc używać backgroundTint w Androidzie 5.0 bez biblioteki obsługi. W praktyce wygląda to na awarię i musisz użyć biblioteki pomocy technicznej, aby działała. Pomyślałem, że wspomnę o tym każdemu, kto jest zdezorientowany, dlaczego API oznaczone jako v21 w dokumentacji deweloperskiej nie działa tak naprawdę do wersji v22; wydaje się, że to błąd.
OldSchool4664

50

Po prostu wymień

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

do

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

3
Nie zapomnij dodać przestrzeni nazw xmlns: app = " schemas.android.com/apk/res-auto "!
Siódmy

Problemem w moim przypadku było ustawienie tła z atrybutem android: background. Zamień na aplikację: backgroundTint rozwiązał problem
Andrey Kolesnikov

13

Jeśli używasz VectorDrawableCompat(zasób Vector), powinieneś użyć:

app:srcCompat="@drawable/x"

zamiast:

android:src="@drawable/x"

7

Miałem ten sam problem i próbowałem innego rozwiązania. Ale tym, co zadziałało dla mnie, było zapewnienie, że wersje biblioteki obsługi aplikacji i obsługi projektowania są takie same. na przykład:

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

3

Innym sposobem otrzymania tego komunikatu jest przypadkowe określenie różnych wersji biblioteki appcompat w różnych modułach. Może się to zdarzyć podczas tworzenia nowego modułu, ponieważ Android Studio domyślnie korzysta z najnowszej wersji.

Aby uzyskać uporządkowany sposób zarządzania tym w projektach wielomodułowych, zobacz: W Gradle, jak zadeklarować wspólne zależności w jednym miejscu?


3

Po prostu zmień androidna app:

android:backgroundTint="@color/accent"

Do:

app:backgroundTint="@color/accent"

2
Witamy w Stack Overflow! Obrazy i zrzuty ekranu mogą być miłym dodatkiem do posta, ale upewnij się, że post jest nadal przejrzysty i przydatny bez nich. Nie publikuj obrazów kodu ani komunikatów o błędach. Przeczytaj dlaczego . Zamiast tego skopiuj i wklej lub wpisz rzeczywisty kod / wiadomość bezpośrednio w poście.
Filnor

0

w moim przypadku było to spowodowane fałszywą konfiguracją motywu aktywności. Problem został rozwiązany po zmianie motywu aplikacji na Theme.AppCompat.xxx.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.