- 问题:
radioGroup.check(id)
时,OnCheckedChangeListener
被调用多次,2次3次都有
-原因:
radioGroup.check(id)
的源码如下
public void check(@IdRes int id) {
// don't even bother
if (id != -1 && (id == mCheckedId)) {
return;
}
if (mCheckedId != -1) {
setCheckedStateForView(mCheckedId, false);
}
if (id != -1) {
setCheckedStateForView(id, true);
}
setCheckedId(id);
}
setCheckedStateForView(id, boolean)
会调用setCheckedId(id)
setCheckedId(id);
源码如下
if (mChecked != checked) {
mCheckedFromResource = false;
mChecked = checked;
refreshDrawableState();
notifyViewAccessibilityStateChangedIfNeeded(
AccessibilityEvent.CONTENT_CHANGE_TYPE_UNDEFINED);
// Avoid infinite recursions if setChecked() is called from a listener
if (mBroadcasting) {
return;
}
mBroadcasting = true;
if (mOnCheckedChangeListener != null) {
//-----------注意这里调用了监听-----------------
mOnCheckedChangeListener.onCheckedChanged(this, mChecked);
}
可以看出,原选中的radioButton
有值,会被调一次mOnCheckedChangeListener
,新选中的也会调一次,最后又会调一次。
所以会出现调用2次或3次的情况。
- 解决:
方法1.将radioGroup.check()
替换成radioButton.setChecked(true)
方法2. 自己维护一个mCheckId
,若监听回调这个checkId
与mCheckId
一致则不处理。若checkId
的view
选中状态为false
也不处理。