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

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)合。

主站蜘蛛池模板: 合水县| 东光县| 衡水市| 广东省| 海原县| 万荣县| 巴彦淖尔市| 福建省| 富蕴县| 锦屏县| 盐边县| 武穴市| 唐河县| 天津市| 元氏县| 新源县| 新邵县| 西宁市| 崇左市| 浦江县| 手机| 铅山县| 广宗县| 阳信县| 东乌| 闸北区| 和硕县| 山西省| 淳化县| 南靖县| 富宁县| 黔南| 新邵县| 中方县| 雷山县| 禄丰县| 顺平县| 和田县| 天峻县| 辽源市| 侯马市|