在Android開發(fā)中CheckBox和RadioButton應(yīng)該是最常用的控件了,但是在不同Android系統(tǒng)的手機(jī)上他們的顯示樣式又都不相同婶熬,為了軟件的統(tǒng)一性開發(fā)中經(jīng)常會(huì)自定義圖標(biāo)來(lái)解決這個(gè)問(wèn)題垂寥。這里有兩種自定義圖標(biāo)的方法:1.通過(guò)button屬性丛肮;2.通過(guò)drawableLeft屬性梆造。但是在使用第一種方法時(shí)遇到了一點(diǎn)問(wèn)題片酝,這也是記錄這篇博客的原因。
在開發(fā)過(guò)程中CheckBox和RadioButton遇到的問(wèn)題是相同的眷射,那么這里就主要以CheckBox為例來(lái)描述敦迄。這兩個(gè)控件都是有兩種狀態(tài)的,所以使用了背景選擇器來(lái)為它們的不同狀態(tài)配置不同的圖片凭迹。
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/checkbox_checked" android:state_checked="true">
</item>
<item android:drawable="@drawable/checkbox_unchecked" android:state_checked="false"></item>
<item android:drawable="@drawable/checkbox_unchecked">
</item>
</selector>
1.使用button
屬性自定義CheckBox的圖標(biāo)
通過(guò)button
屬性為CheckBox重新定義圖標(biāo),同時(shí)可以通過(guò)paddingLeft
屬性設(shè)置圖標(biāo)和文本之間的間隔苦囱。
<CheckBox
android:button="@drawable/check_selector"
android:checked="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="不在顯示"
android:paddingLeft="5dp"
/>
這種方法看上去還不錯(cuò)嗅绸,萬(wàn)萬(wàn)沒(méi)想到碰到一個(gè)詭異的bug,問(wèn)題是這樣的
左邊是異常情況,圖片遮住了文字撕彤。右邊是正常顯示情況鱼鸠。
剛開始以為是屏幕適配的問(wèn)題猛拴,也按著這個(gè)思路去解決了。但是后來(lái)發(fā)現(xiàn)在4.4及以上的系統(tǒng)上沒(méi)有問(wèn)題(沒(méi)那么多系統(tǒng)的手機(jī)蚀狰,4.4及以上沒(méi)發(fā)現(xiàn)問(wèn)題,唯一有的低版本4.0和4.2都有這個(gè)bug)愉昆。要是通過(guò)
paddingLeft
屬性處理的話在高版本的系統(tǒng)上又會(huì)顯得間距較大。后來(lái)又驚奇的發(fā)現(xiàn)如果繼承的是
Activity
的話在低版本的手機(jī)上會(huì)出現(xiàn)同樣的問(wèn)題麻蹋,如果繼承的是v7包里的AppCompatActivity
則問(wèn)題沒(méi)有再出現(xiàn)跛溉。是代碼的bug么,問(wèn)題應(yīng)該是paddingLeft計(jì)算的起始位置不同扮授,跪求解答啊芳室。無(wú)奈由于一些原因我們代碼只能繼承Activity,so使用另一種方法吧刹勃。
2.通過(guò)drawableLeft
屬性自定義CheckBox的圖標(biāo)
CheckBox和RadioButton都是繼承自TextView堪侯,可以使用TextView的drawableLeft
屬性實(shí)現(xiàn)效果,同時(shí)可以使用drawablePadding
設(shè)置圖標(biāo)和文本之間的距離荔仁。使用drawable屬性需要將button和background的值設(shè)置為null
<CheckBox
android:button="@null"
android:background="@null"
android:drawableLeft="@drawable/check_selector"
android:drawablePadding="5dp"
android:checked="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="不在顯示"
/>