RadioButton继承CompoundButton,是单选按钮。
android:checked设置按钮是否选中。
用setOnCheckedChangeListener(OnCheckedChangeListener)来对单选按钮进行监听。
实现RadioButton控件public class RadioButton extends CompoundButton {
@Override
public void toggle() {
if (!isChecked()) {
super.toggle();
}
}
}
RadioButton选择以后不能取消,主要是它覆盖了toggle方法,使其在被选中后无法取消。但可通过setChecked(boolean)方法取消。
RadioButton可以和RadioGroup配合使用,RadioButton只可以选择一个从而达到了单选的目的。android:checkedButton指定初始选项。
private void init() {
mChildOnCheckedChangeListener = new CheckedStateTracker();
mPassThroughListener = new PassThroughHierarchyChangeListener();
super.setOnHierarchyChangeListener(mPassThroughListener);
}
在RadioGroup的构造方法中,调用了init()方法,指定CheckedStateTracker和PassThroughHierarchyChangeListener。
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);
}
}
}
PassThroughHierarchyChangeListener类监听RadioGroup下View的状态,对每个RadioButton添加CheckedStateTracker监听器。
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);
}
}
CheckBox控件介绍
CheckBox继承CompoundButton,是多选按钮。
android:checked设置按钮是否选中。
用setOnCheckedChangeListener(OnCheckedChangeListener)来对多选按钮进行监听。
实现CheckBox控件RadioButton和CheckBox可以通过android:button指定按钮样式。
布局文件
作者:builder2991