关于解决RadioGroup设置setOnCheckedChan

2020-09-16  本文已影响0人  AbTian

关于解决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,就是为什么要这样处理的原因。

上一篇下一篇

猜你喜欢

热点阅读