RadioGroup bottomMenuBar = (RadioGroup) findViewById(R.id.bottomMenuBar);
bottomMenuBar.setOnCheckedChangeListener(this);
bottomMenuBar.check(R.id.tab_new);
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
LogUtil.info(TAG, "onCheckedChanged invoked");
}
上面的代码块很简单,就不解释了,RadioGroup是比较常用的控件,常用在单项选择效果中。
上面代码,我给RadioGroup设置了一个选中改变监听器(RadioGroup.OnCheckedChangeListener),然后调用它的check(id)方法,选中其中一个RadioButton,后面一段是监听回调方法,我简单的做了一个log打印处理。
运行程序时,发现onCheckedChanged invoked被打印了两次,也就是说回调方法被调用了两次:
这明显是我不希望看到的效果,例如我选中某一项,然后做网络请求操作,这种场景下,就会触发两次网络请求,我当然不希望这种情况发生。
如何解决:
我尝试了一些办法,最终决定放弃给RadioGroup设置onCheckedChangedListener这种方式来监听RadioButton的选中事件,而是给每个RadioButton都设置OnClickListener方法来实现,效果还是不错的,可以解决问题。但感觉不爽,心想这明明是个RadioButton,却要用click事件来监听它的选中,总感觉很别扭(看来我有轻微的强迫症,哈哈)。
(这里别看了,重点在下一段)
本来打算就这么做算了,反正能实现效果。后来有一天闲着没事,又想到了这个问题,心中还是觉得很别扭,于是去百度,谷歌了一下,百度真心没有谷歌强,虽然只是搜个问题而已,不足以说明什么哈,我百度了很久,没收获,然后寄希望于谷歌,真没让我失望,同样的问题,复制黏贴到谷歌,搜了一次,还真找到了一些解决思路。
在stackoverflow中找到一个,请点这里,他这个问题是调用三次,不过没关系,最终想要的效果都是让它只调用一次。
从文中得知一个思路,Call b.setChecked(true);
instead. 试了一下,的确可以解决,将上面代码中的check方法删掉用:
((RadioButton) bottomMenuBar.findViewById(R.id.tab_new)).setChecked(true);
运行程序,看log,onCheckedChanged方法只调用了一次:
完。