Android 自訂Drawable 資源引用問題,androiddrawable
問題的複現:
Activity布局檔案代碼如下:
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <RelativeLayout android:clickable="true" android:layout_centerInParent="true" android:layout_width="100dp" android:layout_height="54dp" android:background="@drawable/color_bg_selector"> <TextView android:layout_centerInParent="true" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="25sp" android:textColor="@color/bg_color_text_selector" android:text="確定"/> </RelativeLayout></RelativeLayout>
就一個 按鈕View,背景可改變, TextView 的字型顏色也可改變
color_bg_selector.xml代碼:
<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true"> <shape android:shape="rectangle"> <corners android:radius="5dp"/> <stroke android:color="@color/btn_color_normal" android:width="3dp"/> <solid android:color="@android:color/white"/> </shape> </item> <item android:state_selected="true"> <shape android:shape="rectangle"> <stroke android:color="@color/btn_color_normal" android:width="3dp"/> <solid android:color="@android:color/white"/> <corners android:radius="5dp"/> </shape> </item> <item > <shape android:shape="rectangle"> <stroke android:color="@color/btn_stoke_druck" android:width="3dp"/> <solid android:color="@android:color/white"/> <corners android:radius="5dp"/> </shape> </item></selector>
bg_color_text_selector.xml代碼如下
<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:color="@color/txt_color_normal"/> <item android:state_selected="true" android:color="@color/txt_color_select"/> <item android:state_pressed="true" android:color="@color/txt_color_select"/></selector>
代碼只有一個按鈕,實現點擊的時候改變按鈕的背景顏色,同時字型顏色也要改變,即我們期望的效果是:
對,沒錯,這隻是我們期望的效果,現實往往跟期望是有出入的。
我們把代碼跑起來,結果啟動並執行效果是這樣的:
如果你們覺得有疑問,可以把以上代碼拷貝到工程中跑起來試試!
確實字型的顏色按下的時候沒有改變,why ?why ?why ?why ?
明明設定了字型顏色為
<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:color="@color/txt_color_normal"/> <item android:state_selected="true" android:color="@color/txt_color_select"/> <item android:state_pressed="true" android:color="@color/txt_color_select"/></selector>
我還曾一度懷疑是不是字型顏色不能這樣設定?最後我把它改成跟上面bg_color_text_selector.xml順序一樣
<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_selected="true" android:color="@color/txt_color_select"/> <item android:state_pressed="true" android:color="@color/txt_color_select"/> <item android:color="@color/txt_color_normal"/></selector>
我擦,有效果了!
這裡可以得出結論:drawable 在讀取狀態的時候跟順序有關係!
怎樣能避免這種情況呢?
有兩種方法:
1、不要偷懶,改寫的全部寫全,比如這裡明明是
<item android:state_pressed="false" android:color="@color/txt_color_normal"/>
卻把android:state_pressed=”false” 省略,導致的後果就是沒有效果。
2、把不要的狀態不要寫在裡面,比如這裡
android:state_selected="true"
壓根沒用到,所以不要寫進去,
<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:color="@color/txt_color_normal"/> <item android:state_pressed="true" android:color="@color/txt_color_select"/></selector>
這樣也是有效果的。