【问题标题】: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)
    }
    

    【讨论】:

      猜你喜欢
      • 2014-01-07
      • 2016-04-24
      • 2015-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-15
      • 2016-11-16
      • 2015-07-01
      相关资源
      最近更新 更多