- 問(wèn)題:
radioGroup.check(id)
時(shí),OnCheckedChangeListener
被調(diào)用多次厅各,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)
會(huì)調(diào)用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) {
//-----------注意這里調(diào)用了監(jiān)聽(tīng)-----------------
mOnCheckedChangeListener.onCheckedChanged(this, mChecked);
}
可以看出盗蟆,原選中的radioButton
有值戈二,會(huì)被調(diào)一次mOnCheckedChangeListener
,新選中的也會(huì)調(diào)一次喳资,最后又會(huì)調(diào)一次觉吭。
所以會(huì)出現(xiàn)調(diào)用2次或3次的情況。
- 解決:
方法1.將radioGroup.check()
替換成radioButton.setChecked(true)
方法2. 自己維護(hù)一個(gè)mCheckId
仆邓,若監(jiān)聽(tīng)回調(diào)這個(gè)checkId
與mCheckId
一致則不處理鲜滩。若checkId
的view
選中狀態(tài)為false
也不處理。