- Android Studio開(kāi)發(fā)實(shí)戰(zhàn):從零基礎(chǔ)到App上線(xiàn) (移動(dòng)開(kāi)發(fā)叢書(shū))
- 歐陽(yáng)燊
- 1802字
- 2020-11-28 17:31:40
3.2 特殊按鈕
本節(jié)介紹幾個(gè)常用的特殊控制按鈕,包括復(fù)選框CheckBox的監(jiān)聽(tīng)器用法、開(kāi)關(guān)按鈕Switch的屬性定義、仿iOS開(kāi)關(guān)按鈕的實(shí)現(xiàn)、單選按鈕RadioButton及其組布局RadioGroup的監(jiān)聽(tīng)器用法,以及如何更換這些控件的按鈕圖標(biāo)。
3.2.1 復(fù)選框CheckBox
在學(xué)習(xí)復(fù)選框之前,先了解一下CompoundButton。在Android體系中,CompoundButton類(lèi)是抽象的復(fù)合按鈕,因?yàn)槭浅橄箢?lèi),所以不能直接使用。實(shí)際開(kāi)發(fā)中用的是CompoundButton類(lèi)的幾個(gè)派生類(lèi),主要有復(fù)選框CheckBox、單選按鈕RadioButton以及開(kāi)關(guān)按鈕Switch,這些派生類(lèi)都可使用CompoundButton的屬性和方法。
CompoundButton在布局文件中主要使用下面兩個(gè)屬性。
● checked:指定按鈕的勾選狀態(tài),true表示勾選,false表示未勾選。默認(rèn)未勾選。
● button:指定左側(cè)勾選圖標(biāo)的圖形。如果不指定就使用系統(tǒng)的默認(rèn)圖標(biāo)。
CompoundButton在代碼中可使用下列4種方法進(jìn)行設(shè)置。
● setChecked:設(shè)置按鈕的勾選狀態(tài)。
● setButtonDrawable:設(shè)置左側(cè)勾選圖標(biāo)的圖形。
● setOnCheckedChangeListener:設(shè)置勾選狀態(tài)變化的監(jiān)聽(tīng)器。
● isChecked:判斷按鈕是否勾選。
復(fù)選框CheckBox是CompoundButton一個(gè)最簡(jiǎn)單的實(shí)現(xiàn),點(diǎn)擊復(fù)選框勾選,再次點(diǎn)擊取消勾選。CheckBox通過(guò)setOnCheckedChangeListener方法設(shè)置勾選監(jiān)聽(tīng)器,對(duì)應(yīng)的監(jiān)聽(tīng)器要實(shí)現(xiàn)接口CompoundButton.OnCheckedChangeListener。下面是復(fù)選框自定義勾選監(jiān)聽(tīng)器的代碼:
private class CheckListener implements CompoundButton.OnCheckedChangeListener{ @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { String desc = String.format("您勾選了控件%d,狀態(tài)為%b", buttonView.getId(), isChecked); Toast.makeText(MainActivity.this, desc, Toast.LENGTH_LONG).show(); } }
要更換復(fù)選框左側(cè)的勾選圖像,可將button屬性修改為自定義的勾選圖形。下面是一個(gè)勾選圖形狀態(tài)定義的例子,如果是勾選狀態(tài),就顯示圖形check_choose;如果取消勾選,就顯示圖形check_unchoose。
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_checked="true" android:drawable="@drawable/check_choose"/> <item android:drawable="@drawable/check_unchoose"/> </selector>
3.2.2 開(kāi)關(guān)按鈕Switch
Switch是開(kāi)關(guān)按鈕,Android從4.1.2版本開(kāi)始支持該控件。其實(shí)Switch是一個(gè)高級(jí)版本的CheckBox,在選中與取消選中時(shí)可展現(xiàn)的界面元素比CheckBox豐富。Switch新添加的屬性和設(shè)置方法見(jiàn)表3-2。
表3-2 Switch控件的屬性和設(shè)置方法說(shuō)明

Switch是升級(jí)版的CheckBox,實(shí)際開(kāi)發(fā)中用得不多。原因之一是大家覺(jué)得Switch的默認(rèn)界面很丑,如圖3-5和圖3-6所示,方方正正的圖標(biāo)有點(diǎn)土又有點(diǎn)呆板;原因之二是iPhone作為高大上手機(jī)的代表,大家都覺(jué)得iOS的UI很漂亮,于是無(wú)論是用戶(hù)還是客戶(hù),都希望App做得與iOS控件相像,iOS的開(kāi)關(guān)按鈕UISwitch就成了大家仿照的對(duì)象。

圖3-5 Switch控件的“關(guān)”狀態(tài)

圖3-6 Switch控件的“開(kāi)”狀態(tài)
現(xiàn)在我們要讓Android實(shí)現(xiàn)類(lèi)似iOS的開(kāi)關(guān)按鈕,主要思路是借助狀態(tài)列表圖形StateListDrawable,首先定義一個(gè)狀態(tài)列表,XML的代碼如下:
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_checked="true" android:drawable="@drawable/switch_on"/> <item android:drawable="@drawable/switch_off"/> </selector>
然后把CheckBox控件的background屬性設(shè)置為該狀態(tài)圖形,當(dāng)然button屬性要先設(shè)置為@null。為什么這里修改background屬性,而不直接修改button屬性呢?因?yàn)閎utton屬性是有限制的,無(wú)論多大的圖片,都只顯示一個(gè)小小的圖標(biāo),可是小小的圖標(biāo)怎么能體現(xiàn)用戶(hù)高大上的身份呢?所以這里必須使用background,要它有多大就能有多大,這才夠炫、夠檔次。
最后看看這個(gè)仿iOS開(kāi)關(guān)按鈕的效果,如圖3-7和圖3-8所示。這下開(kāi)關(guān)按鈕脫胎換骨,又圓又鮮艷,看起來(lái)好看很多。

圖3-7 仿iOS按鈕的“關(guān)”狀態(tài)

圖3-8 仿iOS按鈕的“開(kāi)”狀態(tài)
3.2.3 單選按鈕RadioButton
單選按鈕要在一組按鈕中選擇其中一項(xiàng),并且不能多選,這要求有個(gè)容器確定這組按鈕的范圍,這個(gè)容器便是RadioGroup。RadioGroup實(shí)質(zhì)上是個(gè)布局,同一組RadioButton都要放在同一個(gè)RadioGroup節(jié)點(diǎn)下。RadioGroup有orientation屬性可指定下級(jí)控件的排列方向,該屬性為horizontal時(shí),單選按鈕在水平方向排列;該屬性為vertical時(shí),單選按鈕在垂直方向排列。RadioGroup下面除了RadioButton,還可以?huà)燧d其他子控件(如TextView、ImageView等)。這樣看來(lái),RadioGroup就是一個(gè)特殊的線(xiàn)性布局,只不過(guò)多了管理單選按鈕的功能。
下面是RadioGroup常用的3個(gè)方法。
● check:選中指定資源編號(hào)的單選按鈕。
● getCheckedRadioButtonId:獲取選中狀態(tài)單選按鈕的資源編號(hào)。
● setOnCheckedChangeListener:設(shè)置單選按鈕勾選變化的監(jiān)聽(tīng)器。
RadioButton默認(rèn)未選中,點(diǎn)擊后顯示選中,但是再次點(diǎn)擊不會(huì)取消選中。只有點(diǎn)擊同組的其他單選按鈕時(shí),原來(lái)選中的單選按鈕才會(huì)取消選中。另外,單選按鈕的選中事件一般不由RadioButton處理,而是由RadioGroup響應(yīng)。選中事件在實(shí)現(xiàn)時(shí),首先要寫(xiě)一個(gè)選中監(jiān)聽(tīng)器實(shí)現(xiàn)接口RadioGroup.OnCheckedChangeListener,然后調(diào)用RadioGroup對(duì)象的setOnCheckedChangeListener方法注冊(cè)該監(jiān)聽(tīng)器。
下面是用RadioGroup實(shí)現(xiàn)選中監(jiān)聽(tīng)器的代碼:
class RadioListener implements RadioGroup.OnCheckedChangeListener{ @Override public void onCheckedChanged(RadioGroup group, int checkedId) { Toast.makeText(MainActivity.this, "您選中了控件"+checkedId, Toast.LENGTH_LONG).show(); } }
RadioButton經(jīng)常會(huì)更換按鈕圖標(biāo),如果通過(guò)button屬性變更圖標(biāo),那么圖標(biāo)與文字就會(huì)挨得很近,如圖3-9所示的第一個(gè)單選按鈕。為了拉開(kāi)圖標(biāo)與文字之間的距離,得換成drawableLeft屬性展示新圖標(biāo)(不要忘了把button改為@null),此時(shí)再設(shè)置drawablePadding即可指定間隔距離。修改后的單選按鈕效果如圖3-10所示,可以看到圖標(biāo)與文字之間的距離明顯增大了。

圖3-9 圖標(biāo)設(shè)置在button屬性上

圖3-10 圖標(biāo)設(shè)置在drawableLeft屬性上
前面給不同的按鈕自定義按鈕圖標(biāo)先后用了3個(gè)屬性,即自定義CheckBox圖標(biāo)時(shí)的button屬性、仿iOS開(kāi)關(guān)按鈕時(shí)的background屬性以及自定義RadioButton時(shí)的drawableLeft屬性。下面總結(jié)一下這3個(gè)圖標(biāo)設(shè)置方式分別適用的場(chǎng)合。
● button:主要用于圖標(biāo)大小要求不高,間隔要求也不高的場(chǎng)合。
● background:主要用于能夠以較大空間顯示圖標(biāo)的場(chǎng)合。
● drawableLeft:主要用于對(duì)圖標(biāo)與文字之間的間隔有要求的場(chǎng)合。
- Clojure Programming Cookbook
- HTML5+CSS3+JavaScript從入門(mén)到精通:上冊(cè)(微課精編版·第2版)
- Facebook Application Development with Graph API Cookbook
- Spring Boot開(kāi)發(fā)與測(cè)試實(shí)戰(zhàn)
- Testing with JUnit
- 數(shù)據(jù)庫(kù)原理及應(yīng)用(Access版)第3版
- VSTO開(kāi)發(fā)入門(mén)教程
- C++寶典
- HoloLens與混合現(xiàn)實(shí)開(kāi)發(fā)
- UX Design for Mobile
- Isomorphic Go
- Oracle SOA Suite 12c Administrator's Guide
- C++ Windows Programming
- Java EE企業(yè)級(jí)應(yīng)用開(kāi)發(fā)教程:Spring+Spring MVC+MyBatis(第2版)
- ASP.NET開(kāi)發(fā)技巧精講