来自官方设计库的带有FloatingActionButton的InflateException


88

我正在使用FloatingActionButtonGoogle支持设计库中的官员提供的错误。

这是我的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文件中的位置,文件中的行是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" />

额外信息:

这是我的应用主题:

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

@MarkusRubey谢谢。那是值得改变的。我进行了更改,并在Gradle中更新了我的appCompat库,并检查是否可以解决问题。我确实知道即使有这种色彩,在我进行测试时,它也绝不会在5.0之前版本的设备或仿真器上崩溃。但是,并非所有设备的创建方式都一样……
TheLettuceMaster

1
@MarkusRubey我相信正是您的意见解决了这个问题。除非您app像您说的那样使用,否则我认为与5.1 up兼容的着色问题。随时将其添加为答案。
TheLettuceMaster 2015年

Answers:


225

com.android.support:appcompat-v7:21+添加了对在运行Android 5.1之前版本(API级别21)的设备上着色小部件的支持。要使用它,请确保您扩展或设置AppCompat主题并使用app:backgroundTint代替android: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
请注意,在API 21(Android 5.0)中添加了backgroundTint支持:developer.android.com/reference/android / ... 因此,根据规范,您应该能够在没有支持库的情况下在Android 5.0中使用backgroundTint。在实践中,它似乎崩溃了,您需要使用支持库使其正常运行。我只是想对其他任何人都提到这一点,这让为什么在开发文档中标为v21的API直到v22才真正起作用而感到困惑。这似乎是一个错误。
OldSchool4664 2015年


13

如果您使用的是VectorDrawableCompat(向量资产),则应使用:

app:srcCompat="@drawable/x"

代替:

android:src="@drawable/x"

7

我遇到了相同的问题,并尝试了不同的解决方案。但是对我有用的是确保appcompat和设计支持库的版本相同。例如:

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


3

只需更改androidapp

android:backgroundTint="@color/accent"

至:

app:backgroundTint="@color/accent"

2
欢迎使用Stack Overflow!图片和屏幕截图可以很好地添加到帖子中,但是请确保帖子清晰且没有它们也有用。不要张贴代码图像或错误消息。阅读原因。而是直接复制并粘贴或在帖子中键入实际的代码/消息。
Filnor

0

就我而言,这是因为活动主题的配置错误。我将应用程序主题更改为Theme.AppCompat.xxx后,问题得到解决。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.