Selector在drawable和color目錄下使用的規範

  上個星期項目運行在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"
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章