首页 > 解决方案 > Android RdioGroup clearCheck 与 setOnCheckedChangeListener 冲突

问题描述

单击单选按钮时,我正在尝试执行操作:

  dataBinding.radioGroup.setOnCheckedChangeListener { radioGroup: RadioGroup, i: Int ->
       
if( radioGroup.checkedRadioButtonId != -1){
        checkAnswer(i)
       }
    }

在另一个函数里面有一个clearCheck清除单选按钮。问题是每次clearCheck被调用,监听器setOnCheckedChangeListener也被调用。

有没有办法让监听器在选择单选按钮时运行而不是在清除它时运行?

标签: androidkotlinradio-group

解决方案


/**
 * <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)
}

推荐阅读