Selector在drawable和color目录下使用的规范

来源:互联网 发布:怎么js调用方法 编辑:程序博客网 时间:2024/04/29 05:51

  上个星期项目运行在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。

  1. selector作为drawable资源时,放于drawable目录下,并且item指定android:drawable属性,并drawable资源引用使用@drawable
    而不是@color(虽然这样编辑器并不会报错,但是不推荐这么做,避免指定机型出bug)
  2. selector作为color资源时,item指定android:color属性,并放于color目录下。
  3. 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"
0 1
原创粉丝点击