当我扩展我的布局时,会出现以下异常:
E AndroidRuntime: android.view.InflateException: Binary XML file line #11: Binary XML file line #11: Error inflating class <unknown>
E AndroidRuntime: at android.view.LayoutInflater.inflate(LayoutInflater.java:539)
E AndroidRuntime: at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
E AndroidRuntime: at com.myapp.view.MyRecyclerAdapter.onCreateViewHolder(MyRecyclerAdapter:80)
E AndroidRuntime: at android.support.v7.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:5288)
E AndroidRuntime: at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4551)
E AndroidRuntime: at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4461)
E AndroidRuntime: at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1962)
日志中没有“Caused by”,但我添加了代码来捕获异常并调用getCause()
,直到它返回null,以下是事件的顺序:
android.view.InflateException: Binary XML file line #11: Binary XML file line #11: Error inflating class <unknown>
android.view.InflateException: Binary XML file line #11: Error inflating class <unknown>
Error: Binary XML file line #11: Error inflating class <unknown>
android.content.res.Resources$NotFoundException: File res/drawable-v11/selectable_list_background.xml from drawable resource ID #0x7f020096
java.lang.UnsupportedOperationException: Failed to resolve attribute at index 0: TypedValue{t=0x2/d=0x7f0100f9 a=-1}
0x7f020096是selectable_list_background
(见下文),它所引用的TypedValue是?selectableItemBackground
。
我将异常问题缩小到了我的使用?selectableItemBackground
上。更具体地说,我正在使用一个CardView:
<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:foreground="@drawable/selectable_list_background"
card_view:cardCornerRadius="4dp"
card_view:cardElevation="4dp"
>
这是
drawable/selectable_list_background
的相关部分:<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="?selectableItemBackground" />
</selector>
这个活动正在使用我自己的主题,其父级是Theme.AppCompat.Light.NoActionBar
。
这段代码以前可以工作,但是几个月后我找出了这段代码,现在它会因为异常而崩溃。我的猜测是这与将支持库升级到23.0.1和目标SDK升级到23有关,但我还没有切换回22来验证。
如果我删除引用?selectableItemBackground
的那一行,一切都正常。我也尝试过?attr/selectableItemBackground
和?android:attr/selectableItemBackground
,但得到了相同的结果。(后者让我相信这可能不是支持库的问题)。
编辑:
我在调试器中看了一下,我怀疑是android.content.res.Resources
中的这段代码,在loadDrawable()
内部:
Drawable loadDrawable(TypedValue value, int id, Theme theme) throws NotFoundException {
[...]
dr = loadDrawableForCookie(value, id, null);
请注意,该函数需要一个主题,但在调用
loadDrawableForCookie()
时没有传递它,这是最终触发第一个异常的方法。java.lang.UnsupportedOperationException: Failed to resolve attribute at index 0: TypedValue{t=0x2/d=0x7f0100f9 a=-1}
at android.content.res.TypedArray.getDrawable(TypedArray.java:867)
at android.graphics.drawable.StateListDrawable.inflateChildElements(StateListDrawable.java:170)
at android.graphics.drawable.StateListDrawable.inflate(StateListDrawable.java:115)
at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:1215)
at android.graphics.drawable.Drawable.createFromXml(Drawable.java:1124)
at android.content.res.Resources.loadDrawableForCookie(Resources.java:2630)
at android.content.res.Resources.loadDrawable(Resources.java:2540)
at android.content.res.TypedArray.getDrawable(TypedArray.java:870)
at android.view.View.<init>(View.java:4280)
这个代码似乎是Android 6.0版本中新增的 - 5.0版本中的代码有很大不同,但在加载drawable时传递了主题。而且据我所知,主题是必需的 - 相关的属性属于AppCompat
,因此需要活动主题来解决它。
不过这似乎是一个明显的错误,所以我并不确定我走对了路。有什么想法吗?
Theme.AppCompat.Light.NoActionBar
。 - EboMikewindowActionBar
和windowNoTitle
),但是在膨胀时仍然出现相同的异常,具有相同的堆栈跟踪。 - EboMike