来自官方设计库的带有 FloatingActionButton 的 InflateException
Posted
技术标签:
【中文标题】来自官方设计库的带有 FloatingActionButton 的 InflateException【英文标题】:InflateException with FloatingActionButton from Official Design Library 【发布时间】:2015-09-01 10:34:27 【问题描述】:我在使用 Google 支持设计库中的官方 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_
android:layout_
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 的可见性设置为 GONE
,但这是在它膨胀之后,所以这不是问题。
现在,这适用于我的 5.1 设备,但有问题的用户使用的是 5.0。
这是一个已知的错误还是我做错了什么?
【问题讨论】:
android:backgroundTint
在棒棒糖之前的设备上可能会很麻烦。请改用app:backgroundTint
。不过,我无法指出 5.0 的任何问题。
@MarkusRubey 谢谢。这是值得改变的。我更改了它并在 Gradle 中更新了我的 appCompat 库,并检查这是否解决了问题。我确实知道它在我测试时从未在 5.0 之前的设备或模拟器上崩溃过,即使我有那种色调。但并非所有设备都是平等的......
@MarkusRubey 我相信是您的评论解决了这个问题。除非您像您说的那样使用app
,否则我认为与5.1 版本兼容的着色问题。随意添加它作为答案。
【参考方案1】:
com.android.support:appcompat-v7:21+
增加了对在运行 pre 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_
android:layout_
android:layout_margin="16dp"
android:src="@drawable/icon"
app:backgroundTint="@color/accent"
app:borderWidth="0dp" />
【讨论】:
请注意,在 API 21 (Android 5.0) 中添加了 backgroundTint 支持:developer.android.com/reference/android/… 所以根据规范,您应该能够在没有支持库的情况下在 Android 5.0 中使用 backgroundTint。在实践中,它似乎会崩溃,您需要使用支持库才能使其正常工作。我只是想我会为其他困惑的人提到这一点,为什么在开发文档中标记为 v21 的 API 在 v22 之前实际上不能工作;这似乎是一个错误。【参考方案2】:只需替换
<android.support.design.widget.FloatingActionButton
...
...
android:backgroundTint
/>
到
<android.support.design.widget.FloatingActionButton
...
...
app:backgroundTint
/>
【讨论】:
别忘了添加 xmlns:app="schemas.android.com/apk/res-auto" 命名空间! 我的问题是使用 android:background 属性设置背景。替换为 app:backgroundTint 解决了问题【参考方案3】:如果您使用的是VectorDrawableCompat
(矢量资产),您应该使用:
app:srcCompat="@drawable/x"
代替:
android:src="@drawable/x"
【讨论】:
【参考方案4】:我遇到了同样的问题并尝试了不同的解决方案。但对我有用的是确保 appcompat 和设计支持库版本相同。 例如:
compile 'com.android.support:appcompat-v7:23.2.0'
compile 'com.android.support:design:23.2.0'
【讨论】:
【参考方案5】:获取此消息的另一种方法是,如果您不小心在不同的模块中指定了不同版本的 appcompat 库。这很可能在您创建新模块时发生,因为 Android Studio 默认使用最新版本。
有关在多模块项目中管理此问题的简洁方法,请参阅:In Gradle, how do I declare common dependencies in a single place?
【讨论】:
【参考方案6】:只需将android
更改为app
:
android:backgroundTint="@color/accent"
收件人:
app:backgroundTint="@color/accent"
【讨论】:
欢迎来到 Stack Overflow!图片和屏幕截图可以很好地添加到帖子中,但请确保帖子在没有它们的情况下仍然清晰且有用。 不要发布代码或错误消息的图片。阅读why。而是直接将实际代码/消息复制并粘贴或键入到帖子中。【参考方案7】:在我的情况下,这是因为活动主题的错误配置。将应用主题更改为 Theme.AppCompat.xxx 后问题解决。
【讨论】:
以上是关于来自官方设计库的带有 FloatingActionButton 的 InflateException的主要内容,如果未能解决你的问题,请参考以下文章
UITableview + 来自 ipod 库的图像产生不连贯的滚动。有解决方法吗?