1. RadioButton类
RadioButton
继承CompoundButton
,是单选按钮。
android:checked
设置按钮是否选中。用setOnCheckedChangeListener(OnCheckedChangeListener)
来对单选按钮进行监听。
RadioButton
选择以后不能取消,主要是它覆盖了toggle
方法,使其在被选中后无法取消。但可通过setChecked(boolean)
方法取消。
public class RadioButton extends CompoundButton {
@Override
public 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
指定初始选项。
<RadioGroup
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checkedButton="@+id/rb1">
<RadioButton
android:id="@+id/rb1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="足球"/>
<RadioButton
android: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 implements
ViewGroup.OnHierarchyChangeListener {
@Override
public void onChildViewAdded(View parent, View child) {
if (parent == RadioGroup.this && child instanceof RadioButton) {
int id = child.getId();
// generates an id if it's missing
if (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 {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// prevents from infinite recursion
if (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" />
<item
android:drawable="@drawable/checkbox" />
</selector>
布局文件
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="足球"
android:padding="6dp"
android:button="@drawable/check_box_default"/>
<CheckBox
android: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控件