赞
踩
RadioButton继承CompoundButton,是单选按钮。
android:checked设置按钮是否选中。
用setOnCheckedChangeListener(OnCheckedChangeListener)来对单选按钮进行监听。
public class RadioButton extends CompoundButton {
@Override
public void toggle() {
if (!isChecked()) {
super.toggle();
}
}
}
RadioButton选择以后不能取消,主要是它覆盖了toggle方法,使其在被选中后无法取消。但可通过setChecked(boolean)方法取消。
<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="apple"/>
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="orange"/>
</RadioGroup>
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继承CompoundButton,是多选按钮。
android:checked设置按钮是否选中。
用setOnCheckedChangeListener(OnCheckedChangeListener)来对多选按钮进行监听。
RadioButton和CheckBox可以通过android:button指定按钮样式。
<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="25dp"
android:text="orange"
android:padding="10dp"
android:button="@drawable/check_box_default"/>
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="apple"
android:padding="10dp"
android:button="@drawable/check_box_default" />
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。