android - Android RdioGroup clearCheck 与 setOnCheckedChangeListener 冲突
问题描述
单击单选按钮时,我正在尝试执行操作:
dataBinding.radioGroup.setOnCheckedChangeListener { radioGroup: RadioGroup, i: Int ->
if( radioGroup.checkedRadioButtonId != -1){
checkAnswer(i)
}
}
在另一个函数里面有一个clearCheck
清除单选按钮。问题是每次clearCheck
被调用,监听器setOnCheckedChangeListener
也被调用。
有没有办法让监听器在选择单选按钮时运行而不是在清除它时运行?
解决方案
/**
* <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);
}
当你clearCheck()
在 RadioGroup 上调用方法时,如果有一个 RadioButton 被选中,它会将此视图的状态设置为未选中,然后通知应用程序通过调用onCheckedChanged()
你传递给方法的实例的方法setOnCheckedChangeListener()
更改的单选按钮的状态.
这解释了为什么在您的应用程序中,如果用户选择了错误的答案,它会调用onCheckedChange()
两次。前者是状态从 unchecked 变为 checked 时,后者是状态从 checked 变为 unchecked via clearCheck()
。这是预期的行为。
解决方法:调用方法前清除OnCheckedChangeListener,调用clearCheck()
方法后设置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)
}
推荐阅读
- docker - 无法使用覆盖网络在另一台主机上 ping docker 容器
- python - 如何将 pandas df 每一列中的所有行绘制到单独的条形图中
- python - 使用 dask 的 from_array 函数关闭文件
- git - 是否有 git 命令将文件添加到 .git/info/exclude
- swift - 当用户快速结束(终止)应用程序时删除所有待处理的通知
- ios - GeometryReader 在 SwiftUI 中占用额外空间
- reactjs - 为什么我可以使用 IP 地址从 React 应用程序调用 api 端口,但当我使用“localhost”时不能
- javascript - 为什么 PHP AJAX 只能从第二次单击开始工作?
- d3.js - D3:scale.domain 不是函数
- javascript - 在履行承诺时避免显示元素