InflateException với FloatingActionButton từ Thư viện thiết kế chính thức


88

Tôi gặp lỗi khi sử dụng chính thức FloatingActionButtontừ thư viện thiết kế hỗ trợ của Google.

Đây là LogCat của tôi.

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

Dòng duy nhất trỏ đến ứng dụng của tôi là nơi nó thổi phồng xmltệp và dòng trong tệp đó là của tôi 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" />

Thông tin thêm:

Đây là chủ đề ứng dụng của tôi:

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

Có, tôi đang sử dụng một AppCompatActivity.

Tôi nhận thấy rằng tôi đang sử dụng phiên bản appcompat cũ hơn:

com.android.support:appcompat-v7:22.1.1

Điều này dường như được cập nhật:

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

Cũng thế,

minSdkVersion 16
targetSdkVersion 22

Bây giờ, tôi đặt Chế độ hiển thị thành GONEtrong một số trường hợp cho FAB của tôi, nhưng đây là sau khi nó tăng cao nên đó không thể là vấn đề.

Bây giờ, điều này hoạt động với thiết bị 5.1 của tôi, nhưng những người dùng gặp sự cố có 5.0.

Đây có phải là một lỗi đã biết hay có thể tôi đang làm sai điều gì đó?


5
android:backgroundTintcó thể gây rắc rối trên các thiết bị pre-lollipop. Sử dụng app:backgroundTintthay thế. Tôi không thể chỉ ra bất kỳ vấn đề nào cho 5.0.
Markus Rubey

@MarkusRubey Cảm ơn. Đó là điều đáng để thay đổi. Tôi đã thay đổi điều đó và cập nhật thư viện appCompat của mình trong Gradle và kiểm tra xem điều này có khắc phục được sự cố hay không. Tôi biết nó không bao giờ bị rơi trên một thiết bị trước 5.0 hoặc giả lập cho tôi khi tôi đã được thử nghiệm mặc dù tôi đã có màu trong Nhưng không phải tất cả các thiết bị đều như nhau ....
TheLettuceMaster

1
@MarkusRubey Tôi tin rằng nhận xét của bạn đã khắc phục sự cố này. Một vấn đề với pha màu mà tôi nghĩ là tương thích cho 5.1 trở lên trừ khi bạn sử dụng appnhư bạn nói. Hãy thêm nó làm câu trả lời.
TheLet MobileMaster

Câu trả lời:


225

com.android.support:appcompat-v7:21+hỗ trợ thêm cho các tiện ích pha màu trên các thiết bị chạy Android 5.1 trước (API Cấp 21). Để sử dụng nó, hãy đảm bảo rằng bạn mở rộng hoặc đặt AppCompatChủ đề và sử dụng app:backgroundTintthay vì android:backgroundTint.

Thí dụ:

<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
Lưu ý rằng hỗ trợ backgroundTint đã được thêm vào API 21 (Android 5.0): developer.android.com/reference/android/… Vì vậy, theo thông số kỹ thuật, bạn có thể sử dụng backgroundTint trong Android 5.0 mà không cần thư viện hỗ trợ. Trong thực tế, nó dường như bị lỗi và bạn cần sử dụng thư viện hỗ trợ để nó hoạt động. Tôi chỉ nghĩ rằng tôi sẽ đề cập đến điều này cho bất kỳ ai khác bối rối tại sao một API được gắn nhãn là v21 trong tài liệu dành cho nhà phát triển không thực sự hoạt động cho đến v22; nó dường như là một lỗi.
OldSchool4664

50

Chỉ cần thay thế

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

đến

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

3
Đừng quên thêm không gian tên xmlns: app = " schemas.android.com/apk/res-auto "!
Sev

vấn đề trong trường hợp của tôi là đặt nền với thuộc tính android: background. Thay thế bằng ứng dụng: backgroundTint đã giải quyết được vấn đề
Andrey Kolesnikov

13

Nếu bạn đang sử dụng VectorDrawableCompat(Nội dung vectơ), bạn nên sử dụng:

app:srcCompat="@drawable/x"

thay vì:

android:src="@drawable/x"

7

Tôi đã gặp vấn đề tương tự và đã thử giải pháp khác. Nhưng điều phù hợp với tôi là đảm bảo rằng các phiên bản thư viện hỗ trợ thiết kế và ứng dụng đều giống nhau. ví dụ:

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

3

Một cách khác để nhận được thông báo này là nếu bạn vô tình chỉ định các phiên bản khác nhau của thư viện appcompat trong các mô-đun khác nhau. Điều này có thể xảy ra khi bạn tạo một mô-đun mới, vì Android Studio được đặt mặc định là phiên bản mới nhất.

Để có cách quản lý gọn gàng hơn trong các dự án nhiều mô-đun, hãy xem: Trong Gradle, làm cách nào để khai báo các phần phụ thuộc chung ở một nơi duy nhất?


3

Chỉ cần thay đổi androidthành app:

android:backgroundTint="@color/accent"

Đến:

app:backgroundTint="@color/accent"

2
Chào mừng bạn đến với Stack Overflow! Hình ảnh và ảnh chụp màn hình có thể là một bổ sung tuyệt vời cho bài đăng, nhưng hãy đảm bảo rằng bài đăng vẫn rõ ràng và hữu ích nếu không có chúng. Không đăng hình ảnh mã hoặc thông báo lỗi. Đọc tại sao . Thay vào đó, hãy sao chép và dán hoặc nhập trực tiếp mã / tin nhắn thực tế vào bài đăng.
Filnor

0

trong trường hợp của tôi, đó là do cấu hình sai của chủ đề hoạt động. vấn đề đã được giải quyết sau khi tôi thay đổi chủ đề ứng dụng thành Theme.AppCompat.xxx.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.