摘要 當listview的某個item選中時,默認有個選中的高亮顯示,如果你要自定義選中時的高亮顯示效果,可以在listview中設置屬性 android:listSelector="@drawable/item_selector" 其中 item_selector 是在drawable目錄下定義的一個xml文件,這種用於突出不同狀態下
當listview的某個item選中時,默認有個選中的高亮顯示,如果你要自定義選中時的高亮顯示效果,可以在listview中設置屬性
1
|
android:listSelector=
"@drawable/item_selector"
|
其中item_selector
是在drawable目錄下定義的一個xml文件,這種用於突出不同狀態下顯示效果的xml文件我們稱之為selector:
1
2
3
4
5
6
7
|
<?xml version=
"1.0"
encoding=
"utf-8"
?>
<selector
<item android:state_pressed=
"false"
android:drawable=
"@*android:color/transparent"
/>
<item android:state_pressed=
"true"
android:drawable=
"@drawable/grid_item_select_bg"
/>
<item android:state_selected=
"true"
android:drawable=
"@drawable/grid_item_select_bg_night"
/>
</selector>
|
上面這個selector定義了三種狀態下的顯示效果。
但是如果我們想在listview的某個item選中時改變該item的某個textview的文字顏色,上面的辦法就行不通了。那該如何做呢?
其實如果我們真正了解android:listSelector的含義的話,很容易實現上面的需求。
我發現如果不在listview中設置listSelector,也就是將android:listSelector="@drawable/item_selector"去掉,而把item 的background屬性設為item_selector,會得到同樣的選中高亮效果。由此可見listview可以將自己的狀態(state_press、state_select、state_focus等)向內傳遞,當然item本身也可以將這些狀態繼續傳遞給子view。
受此啟發,我們可以將需要高亮顯示文字顏色的TextView的textColor屬性也設置成selector的形式(沒想到吧textColor也可以用drawable定義)。
假設item的xml原本定義為
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<?xml version=
"1.0"
encoding=
"utf-8"
?>
<LinearLayout xmlns:android=
"http://schemas.android.com/apk/res/android"
android:layout_width=
"fill_parent"
android:layout_height=
"fill_parent"
android:orientation=
"vertical"
>
<TextView
android:id=
"@+id/txt"
android:layout_width=
"fill_parent"
android:layout_height=
"wrap_content"
android:text=
"@string/hello"
android:layout_margin=
"5dp"
/>
</LinearLayout>
|
那么可以按照上面的辦法將item的xml改寫為:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<?xml version=
"1.0"
encoding=
"utf-8"
?>
<LinearLayout xmlns:android=
"http://schemas.android.com/apk/res/android"
android:layout_width=
"fill_parent"
android:layout_height=
"fill_parent"
android:orientation=
"vertical"
android:background=
"@drawable/item_selector"
<!-- item背景色變換 -->
>
<TextView
android:id=
"@+id/txt"
android:layout_width=
"fill_parent"
android:layout_height=
"wrap_content"
android:text=
"@string/hello"
android:layout_margin=
"5dp"
android:textColor=
"@drawable/item_text_selector"
<!-- item文字顏色變換 -->
/>
</LinearLayout>
|
其中,item_text_selector
.xml的源碼如下:
1
2
3
4
5
6
7
|
<?xml version=
"1.0"
encoding=
"utf-8"
?>
<item android:state_focused=
"true"
android:color=
"#333333"
/> <!-- focused -->
<item android:state_pressed=
"true"
android:color=
"#333333"
/> <!-- pressed -->
<item android:state_selected=
"true"
android:color=
"#333333"
/> <!-- pressed -->
<item android:color=
"#f4f4f4"
/> <!--
default
-->
</selector>
|
經過本人實際測試該方法可行,如果想更加可靠不妨給TextView 增加個屬性
1
|
android:duplicateParentState=
"true"
|
表示會跟隨ParentView的狀態來變化,其實沒加也不會有問題,因為默認狀態本來就是能傳遞的,只是在某些極端的情況下可以設置這個屬性做一層保險。