美文网首页
关于解决RadioGroup设置setOnCheckedChan

关于解决RadioGroup设置setOnCheckedChan

作者: AbTian | 来源:发表于2020-09-16 17:49 被阅读0次

    关于解决RadioGroup设置setOnCheckedChangeListener()方法,onCheckedChanged()方法首次不调用的问题。

    需求:一个RadioGroup包裹两个RadioButton,通过RadioGroup.setOnCheckedChangeListener()方法,监听RadioButton的选中状态,默认选中其中一个RadioButton并执行该onCheckedChanged()方法中的方法。

    现实举例:比如在登录页面做一个内外网登录的切换需求,默认每次进入登录页面选中内网登录状态。

        override fun onCheckedChanged(group: RadioGroup?, checkedId: Int) {
            when (checkedId) {
                //内网登录
                R.id.rb_in ->{ /*执行内网切换的方法*/}
                //外网登录
                R.id.rb_out ->{/*执行外网切换的方法*/}
    
            }
        }
    

    测试发现,每次进入登录页面,即使设置了

        binding.rgNet.check(binding.rbIn.id)
    //或者
        binding.rbIn.isChecked=true
    

    方法,也不会走onCheckedChanged()方法中"执行内网切换的方法"

    解决方案:

     binding.rgNet.setOnCheckedChangeListener(this)
     binding.rgNet.clearCheck()
     binding.rgNet.check(binding.rbIn.id)
    

    在setOnCheckedChangeListener()方法后,先清空选择状态,在设置需要默认选择的RadioButton

    知其所以然:
    查看check()方法的源码可以知道

        public void check(@IdRes int id) {
            // don't even bother
            //1.如果不先重置清空状态,设置的id和当前默认mCheckedId一样,直接就return了,就不会走后面的onChckedChanged()方法
            if (id != -1 && (id == mCheckedId)) {
                return;
            }
    
            if (mCheckedId != -1) {
                setCheckedStateForView(mCheckedId, false);
            }
    
            if (id != -1) {
                setCheckedStateForView(id, true);
            }
    
            setCheckedId(id);
        }
    
        private void setCheckedId(@IdRes int id) {
            //2.这里,只有重置清空当前的选中状态,才能走到这里,调用onCheckedChanged()方法,
            //而且还必须保证mOnCheckedChangeListener != null,所以要放在setOnCheckedChangeListener()后
            boolean changed = id != mCheckedId;
            mCheckedId = id;
    
            if (mOnCheckedChangeListener != null) {
                mOnCheckedChangeListener.onCheckedChanged(this, mCheckedId);
            }
            if (changed) {
                final AutofillManager afm = mContext.getSystemService(AutofillManager.class);
                if (afm != null) {
                    afm.notifyValueChanged(this);
                }
            }
        }
    

    以上注释1,注释2,就是为什么要这样处理的原因。

    相关文章

      网友评论

          本文标题:关于解决RadioGroup设置setOnCheckedChan

          本文链接:https://www.haomeiwen.com/subject/hxjhyktx.html