Android RadioButton和CheckBox控件
1. RadioButton类
RadioButton
继承CompoundButton
,是单选按钮。
android:checked
设置按钮是否选中。用setOnCheckedChangeListener(OnCheckedChangeListener)
来对单选按钮进行监听。
RadioButton
选择以后不能取消,主要是它覆盖了toggle
方法,使其在被选中后无法取消。但可通过setChecked(boolean)
方法取消。
public class RadioButton extends CompoundButton {@Overridepublic void toggle() {// we override to prevent toggle when the radio is already// checked (as opposed to check boxes widgets)if (!isChecked()) {super.toggle();}}
}
RadioButton
可以和RadioGroup
配合使用,RadioButton
只可以选择一个从而达到了单选的目的。android:checkedButton
指定初始选项。
<RadioGroupandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:checkedButton="@+id/rb1"><RadioButtonandroid:id="@+id/rb1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="足球"/><RadioButtonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="篮球"/>
</RadioGroup>
效果如下
在RadioGroup
的构造方法中,调用了init()
方法,指定CheckedStateTracker
和PassThroughHierarchyChangeListener
。
private void init() {mChildOnCheckedChangeListener = new CheckedStateTracker();mPassThroughListener = new PassThroughHierarchyChangeListener();super.setOnHierarchyChangeListener(mPassThroughListener);
}
PassThroughHierarchyChangeListener
类监听RadioGroup
下View
的状态,对每个RadioButton
添加CheckedStateTracker
监听器。
private class PassThroughHierarchyChangeListener implementsViewGroup.OnHierarchyChangeListener {@Overridepublic void onChildViewAdded(View parent, View child) {if (parent == RadioGroup.this && child instanceof RadioButton) {int id = child.getId();// generates an id if it's missingif (id == View.NO_ID) {id = View.generateViewId();child.setId(id);}((RadioButton) child).setOnCheckedChangeWidgetListener(mChildOnCheckedChangeListener);}if (mOnHierarchyChangeListener != null) {mOnHierarchyChangeListener.onChildViewAdded(parent, child);}}
}
CheckedStateTracker
类,取消原来的选项并设置新的选项。
private class CheckedStateTracker implements CompoundButton.OnCheckedChangeListener {@Overridepublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {// prevents from infinite recursionif (mProtectFromCheckedChange) {return;}mProtectFromCheckedChange = true;if (mCheckedId != -1) {setCheckedStateForView(mCheckedId, false);}mProtectFromCheckedChange = false;int id = buttonView.getId();setCheckedId(id);}
}// 取消原来的选项
private void setCheckedStateForView(int viewId, boolean checked) {View checkedView = findViewById(viewId);if (checkedView != null && checkedView instanceof RadioButton) {((RadioButton) checkedView).setChecked(checked);}
}// 设置新的选项
private void setCheckedId(@IdRes int id) {mCheckedId = id;if (mOnCheckedChangeListener != null) {mOnCheckedChangeListener.onCheckedChanged(this, mCheckedId);}final AutofillManager afm = mContext.getSystemService(AutofillManager.class);if (afm != null) {afm.notifyValueChanged(this);}
}
2. CheckBox类
CheckBox
继承CompoundButton
,是多选按钮。
android:checked
设置按钮是否选中。用setOnCheckedChangeListener(OnCheckedChangeListener)
来对多选按钮进行监听。
3. 自定义按钮
RadioButton
和CheckBox
可以通过android:button
指定按钮样式。样式文件check_box_default.xml
,
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:state_checked="true"android:drawable="@drawable/checkbox_s" /><item android:state_pressed="true"android:drawable="@drawable/checkbox_s" /><itemandroid:drawable="@drawable/checkbox" />
</selector>
布局文件
<CheckBoxandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="20dp"android:text="足球"android:padding="6dp"android:button="@drawable/check_box_default"/>
<CheckBoxandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="篮球"android:padding="6dp"android:button="@drawable/check_box_default" />
效果如下
相关文章
Android RadioButton和CheckBox控件
Android Switch和ToggleButton控件