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