RadioGroup调用check(id)方法时,onCheckedChanged方法被执行多次解决办法

本文介绍了一个关于Android中RadioGroup控件的监听问题及其解决方案。当使用setOnCheckedChangeListener监听器并调用check方法时,会触发多次回调。文章提供了一种通过直接设置RadioButton的选中状态来避免这一问题的方法。
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方法只调用了一次:



完。


<think> 我们正在处理一个关于Android开发中RadioGroup.OnCheckedChangeListener接口的onCheckedChanged方法的问题。用户特别询问了该方法的第二个参数的含义。 根据引用[2]: “setOnCheckedChangeListener (RadioGroup.OnCheckedChangeListener listener); //--一个当该单选按钮组中的单选按钮勾选状态发生改变所要调用的回调函数[^2]。” 同,引用[1]提到: “在RadioGroup init方法中,设置了该listener。在这里回调到onChildViewAdded()方法。再为radiobutton设置了OnCheckedChangeWidgetListener[^1]。” 从这些引用中,我们可以推断出onCheckedChanged方法RadioGroup.OnCheckedChangeListener接口中的回调方法。该方法的签名通常为: ```java void onCheckedChanged(RadioGroup group, int checkedId); ``` 现在,我们具体解释第二个参数: - 第一个参数是RadioGroup对象本身,即触发事件的单选按钮组。 - 第二个参数是一个整数,表示当前被选中的单选按钮(RadioButton)的ID。如果没有单选按钮被选中,则这个值为-1。 引用[2]中提到了几个相关方法,其中: - `RadioGroup.getCheckedRadioButtonId()`:获取选中按钮的id。 - `RadioGroup.clearCheck()`:清除选中状态,此选中的id为-1。 - `RadioGroup.check(int id)`:通过传入选项id来设置该选项为选中状态。 因此,在onCheckedChanged方法中,第二个参数checkedId就是当前被选中的RadioButton的ID(如果没有选中任何按钮,则为-1)。 举例说明: 假设我们有一个RadioGroup,其中包含三个RadioButton,它们的ID分别为R.id.radioButton1, R.id.radioButton2, R.id.radioButton3。当用户选择R.id.radioButton2onCheckedChanged方法的第二个参数就是R.id.radioButton2。 另外,如果我们在代码中调用`RadioGroup.clearCheck()`,那么会触发onCheckedChanged事件,此checkedId为-1。 总结回答: 在安卓Java中,RadioGroup的OnCheckedChangeListener接口的onCheckedChanged方法的第二个参数是当前被选中的RadioButton的ID。如果没有RadioButton被选中,则该参数的值为-1。 现在,根据要求,我们还需要生成相关问题。由于用户询问的是参数说明,我们可以生成一些与RadioGroup使用相关的问题。 §§相关问题§§ 1. 如何在RadioGroup中设置默认选中的RadioButton? 2. 如何处理RadioGroup中没有选中任何RadioButton的情况? 3. RadioGroup的OnCheckedChangeListener在什么情况下会被触发? </think>在 Android Java 开发中,`RadioGroup.OnCheckedChangeListener` 接口的 `onCheckedChanged` 方法有两个参数: ```java void onCheckedChanged(RadioGroup group, int checkedId); ``` **第二个参数 `checkedId` 的解释:** 1. **表示被选中的 RadioButton 的 ID** `checkedId` 是一个整数值,对应当前被选中的 RadioButton 的 `android:id` 资源标识符。 例如:当用户选择 ID 为 `R.id.radioOption1` 的按钮,`checkedId` 的值就是 `R.id.radioOption1` 对应的整数值。 2. **特殊值 `-1` 表示无选中项** 当调用 `RadioGroup.clearCheck()` 清除选中状态,`checkedId` 会返回 `-1`,表示当前没有任何 RadioButton 被选中[^2]。 3. **典型使用场景** ```java radioGroup.setOnCheckedChangeListener((group, checkedId) -> { if (checkedId == R.id.option1) { // 处理选项1被选中 } else if (checkedId == R.id.option2) { // 处理选项2被选中 } else if (checkedId == -1) { // 处理清除选中的情况 } }); ``` 4. **与 RadioButton 的关联** 该参数直接对应布局文件中定义的 RadioButton ID,例如: ```xml <RadioGroup> <RadioButton android:id="@+id/radio_male" .../> <RadioButton android:id="@+id/radio_female" .../> </RadioGroup> ``` 这种设计允许开发者通过资源 ID 精确识别用户选择,同通过 `-1` 明确处理未选中的边界情况[^2][^5]。 ---
评论 13
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值