1.使用RadioGroup check方法會使 回調接口的onCheckedChanged方法回調兩次.check 代碼:
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);//會調用CheckedStateTracker 類onCheckedChanged方法
}
setCheckedId(id);
}
setCheckedStateForView(id,true),會調用自己內部的回調方法
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); //把之前勾選設置爲false
}
mProtectFromCheckedChange = false;
int id = buttonView.getId();
setCheckedId(id); // 這個onCheckedChanged方法跟check方法幾乎做同樣的事
// 如果沒有clearCheck 基本可以簡單成 只要check方法 第一條if 語句和第三條if 語句
}
}
setCheckedId方法:
private void setCheckedId(@IdRes int id) {
mCheckedId = id;
if (mOnCheckedChangeListener != null) {
mOnCheckedChangeListener.onCheckedChanged(this, mCheckedId);
}
...
}
由於調用兩次setCheckedId方法,所以會回調兩次onCheckedChanged.解決方法就是使用子控件的setChecked方法,但是使用這個方法又引出了另一個問題就是不勾選也會回調onCheckedChanged這點需要判斷(setChecked(false)).
2.當一個RadioButton 勾選時,又在初始化方法把這個控件放到最後設置爲setCheck(false),點擊勾選的時候,會自動設置不勾選狀態.這個問題發生在幾個fragment切換的時候.發生這個問題在於:
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); //把之前勾選設置爲false
}
mProtectFromCheckedChange = false;
int id = buttonView.getId();
setCheckedId(id); // 這個onCheckedChanged方法跟check方法幾乎做同樣的事
// 如果沒有clearCheck 基本可以簡單成 只要check方法 第一條if 語句和第三條if 語句
}
}
當我點擊勾選時,由於mCheckId不等於-1 且等於點擊的控件id ,這是控件勾選的狀態已經爲true,調用這個setCheckedStateForView(mCheckedId, false)又把它設置爲false......;
解決方法:1重寫onChcekedChanged方法,把mCheckedId!=-1改成mCheckedId!=-1&&mCheckedId!=id;2把其他子控件調用setChecked方法與這個點擊控件的setChecked方法位置調換,只要不放在後面就可以.3.setCheked後面在增加clearCheck方法,需要注意的是使用clearCheck方法會使onCheckedChanged回調方法的第二個參數爲-1.