InflateException与官方devise库中的FloatingActionButton

我正在使用Google支持devise库中的官方FloatingActionButton一个错误。

这是我的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 

现在,在某些情况下,为了我的FAB,我确实将“可视性”设置为“无效”,但这是在膨胀之后,不能成为问题。

现在,这与我的5.1设备,但有问题的用户有5.0。

这是一个已知的错误,或者我做错了什么?

com.android.support:appcompat-v7:21+增加了对运行在android 5.1(API Level 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" /> 

只要更换

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

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

我有同样的问题,并尝试不同的解决scheme。 但是为我工作的是确保appcompat和devise支持库版本是相同的。 例如:

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

如果你正在使用VectorDrawableCompat (Vector资源),你应该使用:

 app:srcCompat="@drawable/x" 

代替:

 android:src="@drawable/x" 

这解决了我的问题。

获取此消息的另一种方法是,如果您不小心在不同模块中指定了不同版本的appcompat库。 这可能会在您创build新模块时发生,因为Android Studio默认为最新版本。

有关在多模块项目中进行pipe理的简单方法,请参阅: 在Gradle中,如何在单个地方声明公共依赖关系?