InflateException dengan FloatingActionButton dari Official Design Library

88

Saya mendapatkan bug menggunakan resmi FloatingActionButtondari pustaka desain dukungan Google.

Ini LogCat saya.

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

Satu-satunya baris yang mengarah ke aplikasi saya adalah tempat ia memekarkan xmlfile, dan baris di file itu yang merupakan milik saya 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" />

Informasi tambahan:

Ini adalah tema aplikasi saya:

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

Ya, saya menggunakan file AppCompatActivity.

Saya perhatikan saya menggunakan appcompat versi lama:

com.android.support:appcompat-v7:22.1.1

Ini sepertinya mutakhir:

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

Juga,

minSdkVersion 16
targetSdkVersion 22

Sekarang, saya mengatur Visibilitas ke GONEdalam beberapa kasus untuk FAB saya, tetapi ini setelah itu mengembang sehingga tidak bisa menjadi masalah.

Sekarang, ini berfungsi dengan perangkat 5.1 saya, tetapi pengguna yang memiliki masalah memiliki 5.0.

Apakah ini bug yang diketahui atau mungkin saya melakukan kesalahan?

TheLettuceMaster
sumber
5
android:backgroundTintbisa merepotkan pada perangkat pra lollipop. Gunakan app:backgroundTintsebagai gantinya. Saya tidak bisa menunjukkan masalah apa pun untuk 5.0.
Markus Rubey
@MarkusRub Terima kasih. Itu layak diubah. Saya mengubahnya dan memperbarui pustaka appCompat saya di Gradle dan memeriksa untuk melihat apakah ini memperbaiki masalah. Saya tahu itu tidak pernah macet pada perangkat atau emulator pra 5.0 untuk saya ketika saya menguji meskipun saya memiliki warna itu. Tetapi tidak semua perangkat dibuat sama ...
TheLettuceMaster
1
@MarkusRubey Saya yakin komentar Anda yang memperbaiki masalah ini. Masalah dengan pewarnaan yang menurut saya kompatibel untuk 5.1 ke atas kecuali Anda menggunakan appseperti yang Anda katakan. Jangan ragu untuk menambahkannya sebagai jawabannya.
TheLettuceMaster

Jawaban:

225

com.android.support:appcompat-v7:21+menambahkan dukungan untuk widget pewarnaan pada perangkat yang menjalankan Android 5.1 (API Level 21). Untuk memanfaatkannya pastikan Anda memperpanjang atau mengatur AppCompattema dan menggunakan app:backgroundTintbukan android:backgroundTint.

Contoh:

<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
sumber
5
Perhatikan bahwa dukungan backgroundTint telah ditambahkan di API 21 (Android 5.0): developer.android.com/reference/android/… Jadi menurut spesifikasi, Anda seharusnya dapat menggunakan backgroundTint di Android 5.0 tanpa pustaka dukungan. Dalam praktiknya, tampaknya macet, dan Anda perlu menggunakan pustaka dukungan untuk membuatnya berfungsi. Saya hanya berpikir saya akan menyebutkan ini untuk orang lain yang bingung mengapa API berlabel v21 dalam dokumentasi dev tidak benar-benar berfungsi hingga v22; sepertinya itu bug.
OldSchool4664
50

Ganti saja

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

untuk

<android.support.design.widget.FloatingActionButton 
...
...
app:backgroundTint
/>
Abhijeet Mallick
sumber
3
Jangan lupa untuk menambahkan namespace xmlns: app = " schemas.android.com/apk/res-auto "!
Sev
Masalah dalam kasus saya adalah menyetel latar belakang dengan atribut android: background. Ganti dengan app: backgroundTint memecahkan masalah
Andrey Kolesnikov
13

Jika Anda menggunakan VectorDrawableCompat(aset Vektor), Anda harus menggunakan:

app:srcCompat="@drawable/x"

dari pada:

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

Saya memiliki masalah yang sama dan mencoba solusi yang berbeda. Tapi yang berhasil bagi saya adalah memastikan bahwa versi pustaka dukungan appcompat dan desain sama. sebagai contoh:

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

Cara lain untuk mendapatkan pesan ini adalah jika Anda tidak sengaja menentukan versi pustaka appcompat yang berbeda dalam modul yang berbeda. Ini mungkin terjadi saat Anda membuat modul baru, karena Android Studio secara default menggunakan versi terbaru.

Untuk cara yang rapi dalam mengelola ini dalam proyek multi-modul, lihat: Di Gradle, bagaimana cara mendeklarasikan dependensi umum di satu tempat?

ehartwell
sumber
3

Ubah saja androidke app:

android:backgroundTint="@color/accent"

Untuk:

app:backgroundTint="@color/accent"
G.Alima
sumber
2
Selamat datang di Stack Overflow! Gambar dan tangkapan layar bisa menjadi tambahan yang bagus untuk sebuah kiriman, tapi harap pastikan kiriman tersebut masih jelas dan berguna tanpanya. Jangan memposting gambar kode atau pesan kesalahan. Baca alasannya . Sebagai gantinya salin dan tempel atau ketikkan kode / pesan aktual ke dalam kiriman secara langsung.
Filnor
0

dalam kasus saya, itu karena konfigurasi tema aktivitas yang salah. masalah terpecahkan setelah saya mengubah tema aplikasi ke Theme.AppCompat.xxx.

Stevens
sumber