選擇按鈕在開發過程中也是使用頻率非常高的控件. 但是我發現很多人都是一知半解, 總結下Android選擇按鈕控件;
記得活用目錄功能
包括以下控件:
- CheckBox 多選框
- RadioButton 單選框
- Switch 開關
- ToggleButton 切換按鈕
CompoundButton
繼承關系
java.lang.Object ↳android.view.View ↳android.widget.TextView ↳android.widget.Button ↳android.widget.CompoundButton 直接繼承CompoundButton的子類 CheckBox, RadioButton, Switch, SwitchCompat, ToggleButton
可以看出所有選擇的控件都繼承自CompoundButton這個類. 其實他的幾個子類都沒有新增多少方法. 都是使用的該類的方法和屬性.
該類是抽象類, CompoundButton并不能直接寫在布局檔案中. 他是所有選擇按鈕的父類. 幾個常用的方法都是繼承自該類.
屬性介紹
比起他的父類Button其實也就新增了四個布局屬性.
屬性 描述 android:button 設定一張圖檔來作為顯示 android:buttonTint 渲染顔色 android:buttonTintMode 渲染模式 android:checked 設定為選中狀态 方法介紹
用來重寫進行自定義控件的方法我不夠熟悉我就不講了.
設定選擇狀态
可以通過設定參數在選中和未選中的狀态之間切換.
void setChecked (boolean checked)
判斷是否被選擇
boolean isChecked ()
設定按鈕的圖檔
等用于屬性android:button, 設定按鈕的圖檔顯示. 以下我用RadioButton作為示例
void setButtonDrawable (Drawable drawable) // 設定按鈕顯示
void setButtonDrawable (int resId) // 資源id設定按鈕圖檔
Drawable getButtonDrawable () // 得到按鈕的圖檔
設定渲染色彩
給按鈕加上濾鏡一樣的色彩遮蓋. 同樣之前我在屬性裡面也介紹過了. 這需要同時調用兩個方法:
- 渲染顔色
- 渲染模式
設定渲染顔色
void setButtonTintList (ColorStateList tint)
設定渲染模式
void setButtonTintMode (PorterDuff.Mode tintMode)
選擇狀态改變監聽器
該方法是最常用的.
void setOnCheckedChangeListener (CompoundButton.OnCheckedChangeListener listener)
切換目前選擇狀态
和setChecked不同的是他隻能從選中, 不能取消選中.
void toggle ()
擷取Padding值
int getCompoundPaddingLeft ()
int getCompoundPaddingRight ()
模拟點選
該方法是View就有的. 手動模拟使用者點選事件
boolean performClick ()
CheckBox
多選框控件, 這個控件沒什麼好講的. 相對父類CompoundButton沒有新增任何方法. 主要就是提供選擇的狀态變化. 可以看做最基本的選擇控件.
使用方法
直接在布局檔案中寫即可
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="設計師吳彥祖"
/>
效果圖:
RadioButton
這是一個單選按鈕的控件對象.
使用起來很簡單:
<RadioButton
android:id="@+id/radioButton3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="RadioButton"/>
RadioGroup
既然是單選, 那肯定不止一個選擇按鈕吧. 這裡就要涉及到另一個類RadioGroup了. 隻有被RadioGroup包括的RadioButton之間才存在單選的關系.
<RadioGroup
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:orientation="horizontal"
android:checkedButton="@id/radioButton3"
>
<RadioButton
android:id="@+id/radioButton3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="RadioButton"/>
<RadioButton
android:id="@+id/radioButton4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="RadioButton"/>
</RadioGroup>
可以看到RadioGroup使用了兩個屬性:
android:orientation="horizontal" // 設定内部的按鈕是水準還是垂直排列
android:checkedButton="@id/radioButton3" // 設定預設被選中的按鈕是那個
方法介紹
添加View
添加一個子View到RadioGroup的容器中.
void addView (View child, // 視圖内容
int index, // 索引位置
ViewGroup.LayoutParams params) // 設定添加進來的View的布局參數
手動單選
void check (int id) // RadioButton的資源id
清除所有選擇
void clearCheck ()
設定一個新的布局參數
RadioGroup.LayoutParams generateLayoutParams (AttributeSet attrs)
被選中RadioButtonId
得到目前被選中的RadioButton. 如果沒有任何RadioButton被選中傳回-1
int getCheckedRadioButtonId ()
void setOnCheckedChangeListener (RadioGroup.OnCheckedChangeListener listener)
層級變化監聽器
在RadioGroup容器添加或者删除子控件的時候回調該監聽器
void setOnHierarchyChangeListener (ViewGroup.OnHierarchyChangeListener listener)
ToggleButton
void setTextOff(CharSequence textOff)
void setTextOn(CharSequence textOn)
CharSequence getTextOff()
CharSequence getTextOn()
void setChecked(boolean checked)
屬性
android:textOff
android:textOn
android:disabledAlpha
由于繼承自Button同樣可以使用checkChangeListener監聽按鈕選擇
mToggleButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
}
});
或者使用TextChangedListener監聽文字變化
mToggleButton.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override public void afterTextChanged(Editable s) {
}
});
Switch
切換開關按鈕. 類似ToggleButton. 但是擁有平滑切花動畫. 支援自定義樣式.
Tip: 圓形是按鈕, 圓角長方形是軌道.
api v21 才能使用的屬性
android:showText // 在按鈕上面顯示文本内容: (開啟/關閉)
android:splitTrack // 軌道和按鈕分開(即不會重疊在一起)
Tip: showText和setText方法顯示的文本是不同區域的. 非同一個.
文本内容自定義
android:switchMinWidth // 軌道的長度
android:switchPadding // Switch和文本内容(setText)的間距
android:switchTextAppearance // showText 的文本樣式
// 開啟和關閉狀态下顯示的文本, 如果沒有啟用showText無效
android:textOff
android:textOn
按鈕圖示自定義
android:thumb // 按鈕圖示
android:thumbTextPadding // 如果使用了thumb, 可以控制showText的文本邊距
android:thumbTint // 按鈕着色
android:thumbTintMode // 着色模式
Tip: Thumb不能引用顔色屬性(否則不顯示), 如果指定普通Drawable情況Switch的On和Off顯示的按鈕都是一樣. 可以通過指定selector來控制切換按鈕.
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="true" android:drawable="@drawable/ic_sun"/>
<item android:drawable="@drawable/ic_moon"/>
</selector>
軌道自定義
android:track
android:trackTint
android:trackTintMode
自定義Track的高度和寬度都受到Thumb的限制.
代碼的功能XML屬性全部都實作
更多Android進階技術,面試資料系統整理分享,職業生涯規劃,産品,思維,行業觀察,談天說地。可以加Android架構師群;701740775。