InflateException ด้วย FloatingActionButton จาก Official Design Library


88

ฉันได้รับข้อบกพร่องโดยใช้อย่างเป็นทางการFloatingActionButtonจากไลบรารีการสนับสนุนการออกแบบของ Google

นี่คือ 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

บรรทัดเดียวที่ชี้ไปที่แอพของฉันคือตำแหน่งที่ขยายxmlไฟล์และบรรทัดในไฟล์นั้นซึ่งเป็นไฟล์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" />

ข้อมูลเพิ่มเติม:

นี่คือธีมแอปของฉัน:

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

ใช่ฉันกำลังใช้AppCompatActivityไฟล์.

ฉันสังเกตเห็นว่าฉันใช้ appcompat เวอร์ชันเก่ากว่า:

com.android.support:appcompat-v7:22.1.1

ดูเหมือนว่าจะเป็นข้อมูลล่าสุด:

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

นอกจากนี้

minSdkVersion 16
targetSdkVersion 22

ตอนนี้ฉันตั้งค่าการมองเห็นเป็นGONEในบางกรณีสำหรับ FAB ของฉัน แต่หลังจากที่มันขยายตัวจึงไม่สามารถเป็นปัญหา

ตอนนี้สิ่งนี้ใช้ได้กับอุปกรณ์ 5.1 ของฉัน แต่ผู้ใช้ที่มีปัญหามี 5.0

นี่เป็นข้อบกพร่องที่ทราบแล้วหรือฉันอาจทำอะไรผิดพลาด?


5
android:backgroundTintอาจเป็นปัญหากับอุปกรณ์ก่อนอมยิ้ม ใช้app:backgroundTintแทน ฉันไม่สามารถชี้ให้เห็นปัญหาใด ๆ สำหรับ 5.0 ได้
Markus Rubey

@MarkusRubey ขอบคุณ นั่นคือมูลค่าการเปลี่ยนแปลง ฉันเปลี่ยนและอัปเดตไลบรารี appCompat ของฉันใน Gradle และตรวจสอบเพื่อดูว่าสามารถแก้ไขปัญหาได้หรือไม่ ฉันรู้ว่ามันไม่เคยขัดข้องในอุปกรณ์หรือโปรแกรมจำลองก่อน 5.0 สำหรับฉันเมื่อฉันกำลังทดสอบแม้ว่าฉันจะมีสีนั้น แต่อุปกรณ์ทั้งหมดไม่ได้สร้างขึ้นเท่ากัน ...
TheLettuceMaster

1
@MarkusRubey ฉันเชื่อว่ามันเป็นความคิดเห็นของคุณที่แก้ไขปัญหานี้ ปัญหาเกี่ยวกับการย้อมสีซึ่งฉันคิดว่าเข้ากันได้กับ 5.1 ขึ้นเว้นแต่คุณจะใช้appเหมือนที่คุณพูด อย่าลังเลที่จะเพิ่มเป็นคำตอบ
TheLettuceMaster

คำตอบ:


225

com.android.support:appcompat-v7:21+เพิ่มการสนับสนุนสำหรับการย้อมสีวิดเจ็ตบนอุปกรณ์ที่ใช้ Android 5.1 ก่อน (API ระดับ 21) เพื่อให้ใช้ประโยชน์จากมันให้แน่ใจว่าคุณขยายหรือตั้งAppCompatธีมและใช้แทนapp:backgroundTintandroid:backgroundTint

ตัวอย่าง:

<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
โปรดทราบว่ามีการเพิ่มการรองรับ backgroundTint ใน API 21 (Android 5.0): developer.android.com/reference/android/… ดังนั้นตามข้อมูลจำเพาะคุณควรจะสามารถใช้ backgroundTint ใน Android 5.0 ได้โดยไม่ต้องมีไลบรารีการสนับสนุน ในทางปฏิบัติดูเหมือนว่าจะขัดข้องและคุณต้องใช้ไลบรารีสนับสนุนเพื่อให้ทำงานได้ ฉันแค่คิดว่าฉันจะพูดถึงสิ่งนี้สำหรับคนอื่นที่สับสนว่าทำไม API ที่ระบุว่าเป็น v21 ในเอกสาร dev ใช้งานไม่ได้จริงจนถึง v22 ดูเหมือนว่าจะเป็นจุดบกพร่อง
OldSchool4664

50

เพียงแค่แทนที่

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

ถึง

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

3
อย่าลืมเพิ่ม xmlns: app = " schemas.android.com/apk/res-auto " เนมสเปซ!
Sev

ปัญหาในกรณีของฉันคือการตั้งค่าพื้นหลังด้วย android: background attribute แทนที่ด้วยแอป: backgroundTint แก้ไขปัญหา
Andrey Kolesnikov


7

ฉันมีปัญหาเดียวกันและลองวิธีแก้ปัญหาอื่น แต่สิ่งที่เหมาะกับฉันคือเพื่อให้แน่ใจว่า appcompat และไลบรารีการสนับสนุนการออกแบบเวอร์ชันเดียวกัน ตัวอย่างเช่น:

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

3

อีกวิธีหนึ่งในการรับข้อความนี้คือหากคุณระบุไลบรารี appcompat เวอร์ชันต่างๆในโมดูลต่างๆโดยไม่ได้ตั้งใจ สิ่งนี้มีแนวโน้มที่จะเกิดขึ้นเมื่อคุณสร้างโมดูลใหม่เนื่องจาก Android Studio มีค่าเริ่มต้นเป็นเวอร์ชันล่าสุด

สำหรับวิธีที่เป็นระเบียบเรียบร้อยในการจัดการสิ่งนี้ในโครงการหลายโมดูลโปรดดูที่Gradle ใน Gradle ฉันจะประกาศการอ้างอิงทั่วไปในที่เดียวได้อย่างไร


3

เพียงแค่เปลี่ยนandroidเป็นapp:

android:backgroundTint="@color/accent"

ถึง:

app:backgroundTint="@color/accent"

2
ยินดีต้อนรับสู่ Stack Overflow! รูปภาพและภาพหน้าจอเป็นส่วนเสริมที่ดีสำหรับโพสต์ แต่โปรดตรวจสอบให้แน่ใจว่าโพสต์นั้นยังคงชัดเจนและมีประโยชน์หากไม่มีพวกเขา อย่าโพสต์ภาพรหัสหรือข้อความแสดงข้อผิดพลาด อ่านทำไม แทนที่จะคัดลอกและวางหรือพิมพ์รหัส / ข้อความจริงลงในโพสต์โดยตรง
Filnor

0

ในกรณีของฉันมันเป็นเพราะการกำหนดค่าธีมกิจกรรมที่ผิดพลาด ปัญหาได้รับการแก้ไขหลังจากฉันเปลี่ยนธีมแอพเป็น Theme.AppCompat.xxx

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.