上个星期项目运行在4.3的机子上出了一个很奇怪的bug,就是到了指定页面就会崩溃,而其他的页面并不会出现这个问题,log日志打印打印如下:
android.view.InflateException: Binary XML file line #2: Error inflating class <unknown>
...
报错的地方在该页面的adapter的inflate布局处,而且是在第二行,这就让我一脸懵逼,我的根布局就是使用的是一个简简单的相对布局,也不是什么自定义的布局。而且试遍了公司所有的测试机,仅仅在这个sansong的机子上有问题。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/recycler_item_click_selector"
android:paddingLeft="13dp"></RelativeLayout>
后来在网上找寻解决方案,但是最终却没有找到办法解决这个bug,就当我快要放弃的时候,公司的老大说他貌似知道哪里的问题,他说他之前也踩过这个坑。没错就是我的跟布局的background属性的这个自定义条目点击背景,修改之前我是这么写的:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@color/background_item"/>
<item android:drawable="@color/white"/>
</selector>
可以看到我的drawable文件引用的时候@color中的资源颜色资源,当然基础扎实的人可能不会这么写,我这个小菜鸟就在这里栽了坑。借此机会也学习了一下到底如何规范使用颜色selector和drawable的selector。
- selector作为drawable资源时,放于drawable目录下,并且item指定android:drawable属性,并drawable资源引用使用@drawable
而不是@color(虽然这样编辑器并不会报错,但是不推荐这么做,避免指定机型出bug)- selector作为color资源时,item指定android:color属性,并放于color目录下。
- res/values/colors中的条目即可以使用
<color name="colorAccent">#FF4081</color>
也可以使用<drawable
name="white">#ffffffff</drawable>
所以修复完成后应该改成:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:color="@color/background_item"/>
<item android:color="@color/white"/>
</selector>
并将该selector放在color文件夹下,本布局中引用换成
android:background="@color/recycler_item_click_selector"