【问题标题】:Android RdioGroup clearCheck conflict with setOnCheckedChangeListenerAndroid RdioGroup clearCheck 与 setOnCheckedChangeListener 冲突
【发布时间】:2021-02-11 22:26:09
【问题描述】:
单击单选按钮时,我正在尝试执行操作:
dataBinding.radioGroup.setOnCheckedChangeListener { radioGroup: RadioGroup, i: Int ->
if( radioGroup.checkedRadioButtonId != -1){
checkAnswer(i)
}
}
在另一个函数中有一个clearCheck 来清除单选按钮。
问题是每次调用clearCheck 时,也会调用监听器setOnCheckedChangeListener。
有没有办法让监听器在单选按钮被选中而不是被清除时运行?
【问题讨论】:
标签:
android
kotlin
radio-group
【解决方案1】:
/**
* <p>Interface definition for a callback to be invoked when the checked
* radio button changed in this group.</p>
*/
public interface OnCheckedChangeListener {
/**
* <p>Called when the checked radio button has changed. When the
* selection is cleared, checkedId is -1.</p>
*
* @param group the group in which the checked radio button has changed
* @param checkedId the unique identifier of the newly checked radio button
*/
public void onCheckedChanged(RadioGroup group, @IdRes int checkedId);
}
当你在 RadioGroup 上调用clearCheck() 方法时,如果有一个 RadioButton 被选中,它会将此视图的状态设置为未选中,然后通过调用 onCheckedChanged() 通知应用程序有关单选按钮的状态更改您传递给setOnCheckedChangeListener() 方法的实例的方法。
这解释了为什么在您的应用中,如果用户选择了错误的答案,它会调用两次onCheckedChange()。前者是状态从unchecked变为checked,后者是通过clearCheck()从checked变为unchecked。这是预期的行为。
解决方法:在调用clearCheck()方法前清除OnCheckedChangeListener,在调用clearCheck()方法后设置。
// Declare this variable
private val onCheckedChangeListener = object : RadioGroup.OnCheckedChangeListener {
override fun onCheckedChanged(group: RadioGroup?, checkedId: Int) {
if (checkedId != -1) {
checkAnswer(checkedId)
}
}
}
// Calling this line once, inside onCreate() of Activity
// or onCreateView() of Fragment for example
dataBinding.radioGroup.setOnCheckedChangeListener(onCheckedChangeListener)
private fun checkAnswer(checkedId: Int) {
// Your logic to check answer here
// ...
// If the answer is wrong, just clear check
dataBinding.radioGroup.setOnCheckedChangeListener(null)
dataBinding.radioGroup.clearCheck()
dataBinding.radioGroup.setOnCheckedChangeListener(onCheckedChangeListener)
}