RadioGroup和RadioButton 結合使用出現的問題.

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.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章