Otrzymuję błąd, używając oficjalnego FloatingActionButton
z 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 xml
plik, 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ść GONE
w 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?
android
android-appcompat
inflate-exception
floating-action-button
android-support-design
TheLettuceMaster
źródło
źródło
android:backgroundTint
może być kłopotliwe na urządzeniach sprzed wersji Lollipop. Użyjapp:backgroundTint
zamiast tego. Nie mogę jednak wskazać żadnych problemów w wersji 5.0.app
tak, jak mówisz. Możesz go dodać jako odpowiedź.Odpowiedzi:
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ćAppCompat
motyw i użyćapp:backgroundTint
zamiastandroid: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" />
źródło
Po prostu wymień
do
źródło
Jeśli używasz
VectorDrawableCompat
(zasób Vector), powinieneś użyć:app:srcCompat="@drawable/x"
zamiast:
android:src="@drawable/x"
źródło
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'
źródło
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?
źródło
Po prostu zmień
android
naapp
:android:backgroundTint="@color/accent"
Do:
app:backgroundTint="@color/accent"
źródło
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.
źródło