官术网_书友最值得收藏!

3.2 特殊按鈕

本節介紹幾個常用的特殊控制按鈕,包括復選框CheckBox的監聽器用法、開關按鈕Switch的屬性定義、仿iOS開關按鈕的實現、單選按鈕RadioButton及其組布局RadioGroup的監聽器用法,以及如何更換這些控件的按鈕圖標。

3.2.1 復選框CheckBox

在學習復選框之前,先了解一下CompoundButton。在Android體系中,CompoundButton類是抽象的復合按鈕,因為是抽象類,所以不能直接使用。實際開發中用的是CompoundButton類的幾個派生類,主要有復選框CheckBox、單選按鈕RadioButton以及開關按鈕Switch,這些派生類都可使用CompoundButton的屬性和方法。

CompoundButton在布局文件中主要使用下面兩個屬性。

  • checked:指定按鈕的勾選狀態,true表示勾選,false表示未勾選。默認未勾選。
  • button:指定左側勾選圖標的圖形。如果不指定就使用系統的默認圖標。

CompoundButton在代碼中可使用下列4種方法進行設置。

  • setChecked:設置按鈕的勾選狀態。
  • setButtonDrawable:設置左側勾選圖標的圖形。
  • setOnCheckedChangeListener:設置勾選狀態變化的監聽器。
  • isChecked:判斷按鈕是否勾選。

復選框CheckBox是CompoundButton一個最簡單的實現,點擊復選框勾選,再次點擊取消勾選。CheckBox通過setOnCheckedChangeListener方法設置勾選監聽器,對應的監聽器要實現接口CompoundButton.OnCheckedChangeListener。下面是復選框處理勾選監聽器的代碼例子:

要更換復選框左側的勾選圖像,可將button屬性修改為自定義的勾選圖形。下面是一個勾選圖形狀態定義的例子,如果是勾選狀態,就顯示圖形check_choose;如果取消勾選,就顯示圖形check_unchoose。

3.2.2 開關按鈕Switch

Switch是開關按鈕,Android從4.0版本開始支持該控件。其實Switch是一個高級版本的CheckBox,在選中與取消選中時可展現的界面元素比CheckBox豐富。Switch新添加的屬性和設置方法見表3-2。

表3-2 Switch控件的屬性和設置方法說明

Switch是升級版的CheckBox,實際開發中用得不多。原因之一是大家覺得Switch的默認界面很丑,如圖3-5和圖3-6所示,方方正正的圖標有點土又有點呆板;原因之二是iPhone作為高大上手機的代表,大家都覺得iOS的UI很漂亮,于是無論是用戶還是客戶,都希望App做得與iOS控件相像,iOS的開關按鈕UISwitch就成了大家仿照的對象。

圖3-5 Switch控件的“關”狀態

圖3-6 Switch控件的“開”狀態

現在我們要讓Android實現類似iOS的開關按鈕,主要思路是借助狀態列表圖形StateListDrawable,首先定義一個狀態列表,XML的代碼如下:

然后把CheckBox控件的background屬性設置為該狀態圖形,當然button屬性要先設置為@null。為什么這里修改background屬性,而不直接修改button屬性呢?因為button屬性是有限制的,無論多大的圖片,都只顯示一個小小的圖標,可是小小的圖標怎么能體現用戶高大上的身份呢?所以這里必須使用background,要它有多大就能有多大,這才夠炫、夠檔次。

最后看看這個仿iOS開關按鈕的效果,如圖3-7和圖3-8所示。這下開關按鈕脫胎換骨,又圓又鮮艷,看起來好看很多。

圖3-7 仿iOS按鈕的“關”狀態

圖3-8 仿iOS按鈕的“開”狀態

3.2.3 單選按鈕RadioButton

單選按鈕要在一組按鈕中選擇其中一項,并且不能多選,這要求有個容器確定這組按鈕的范圍,這個容器便是RadioGroup。RadioGroup實質上是個布局,同一組RadioButton都要放在同一個RadioGroup節點下。RadioGroup有orientation屬性可指定下級控件的排列方向,該屬性為horizontal時,單選按鈕在水平方向排列;該屬性為vertical時,單選按鈕在垂直方向排列。RadioGroup下面除了RadioButton,還可以掛載其他子控件(如TextView、ImageView等)。這樣看來,RadioGroup就是一個特殊的線性布局,只不過多了管理單選按鈕的功能。

下面是RadioGroup常用的3個方法。

  • check:選中指定資源編號的單選按鈕。
  • getCheckedRadioButtonId:獲取選中狀態單選按鈕的資源編號。
  • setOnCheckedChangeListener:設置單選按鈕勾選變化的監聽器。

RadioButton默認未選中,點擊后顯示選中,但是再次點擊不會取消選中。只有點擊同組的其他單選按鈕時,原來選中的單選按鈕才會取消選中。另外,單選按鈕的選中事件一般不由RadioButton處理,而是由RadioGroup響應。選中事件在實現時,首先要寫一個單選監聽器實現接口RadioGroup.OnCheckedChangeListener,然后調用RadioGroup對象的setOnCheckedChangeListener方法注冊該監聽器。

下面是用RadioGroup實現單選監聽器的代碼:

RadioButton經常會更換按鈕圖標,如果通過button屬性變更圖標,那么圖標與文字就會挨得很近,如圖3-9所示的第一個單選按鈕。為了拉開圖標與文字之間的距離,得換成drawableLeft屬性展示新圖標(不要忘了把button改為@null),此時再設置drawablePadding即可指定間隔距離。修改后的單選按鈕效果如圖3-10所示,可以看到圖標與文字之間的距離明顯增大了。

圖3-9 圖標設置在button屬性上

圖3-10 圖標設置在drawableLeft屬性上

前面給不同的按鈕自定義按鈕圖標先后用了3個屬性,即自定義CheckBox圖標時的button屬性、仿iOS開關按鈕時的background屬性以及自定義RadioButton時的drawableLeft屬性。下面總結一下這3個圖標設置方式分別適用的場合。

  • button:主要用于圖標大小要求不高,間隔要求也不高的場合。
  • background:主要用于能夠以較大空間顯示圖標的場合。
  • drawableLeft:主要用于對圖標與文字之間的間隔有要求的場合。
主站蜘蛛池模板: 睢宁县| 佛山市| 张家川| 垣曲县| 伊春市| 蒙城县| 朝阳县| 灵丘县| 漳平市| 安义县| 东乌珠穆沁旗| 麻江县| 天峻县| 高安市| 舟曲县| 宜丰县| 镇巴县| 景泰县| 桦南县| 汉沽区| 金乡县| 邵武市| 阳曲县| 石柱| 德化县| 米泉市| 绵竹市| 宝鸡市| 蛟河市| 江山市| 吐鲁番市| 芜湖市| 始兴县| 宝丰县| 峡江县| 武隆县| 汾西县| 遂平县| 贵阳市| 新龙县| 蓬莱市|