当我展开布局时,我得到一个例外:
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()
直到它返回空值,下面是事件序列: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
(见下文),类型dValue it引用是?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)
这段代码似乎是Android6.0的新代码——5.0的代码是完全不同的,但是在加载Drawable时,主题是传入的。主题是必要的-所讨论的属性是
AppCompat
的一部分,因此需要活动的主题来解决它。不过,这似乎是一个明显的错误,所以我不相信我在这里走对了。有什么想法吗?
最佳答案
官方答案-您不能将主题属性用于android:drawable
或android:src
属性。设计上根本不可能。还有另一个答案探讨了同样的问题并提供了解决方案:How to reference style attributes from a drawable?
在我的例子中,我不能真的这么做,因为AppCompat的?selectableItemBackground
引用了一个私有的可绘制文件。所以我选择了一个代码解决方案-我将前台设置为?selectableItemBackground
而卡没有被选中,并且一旦我处于选择模式,我自己的状态列表就可以绘制。
这是一个非常难看的解决方案,非常难看,我不会在这里共享代码,但我能想到的最好的解决方案是。如果有人有更好的解决方案,我很想听听。