我对放射组的clearchecked()有问题。我向用户显示一个多项选择题,用户选择答案后,我检查答案,给他一些反馈,然后转到下一个问题。在转到下一个问题的过程中,我清楚地检查了放射组。
有人能解释一下为什么oncheckedchanged方法被调用了3次吗?一次当更改实际发生时(用户更改),一次当我清除检查时(用-1作为所选id),以及一次介于两者之间(用户再次更改)?
据我所知,第二个触发器是由clearcheck触发的。代码如下:

private void checkAnswer(RadioGroup group, int checkedId){
    // this makes sure it doesn't blow up when the check is cleared
    // also we don't check the answer when there is no answer
    if (checkedId == -1) return;
    if (group.getCheckedRadioButtonId() == -1) return;

    // check if correct answer
    if (checkedId == validAnswerId){
        score++;
        this.giveFeedBack(feedBackType.GOOD);
    } else {
        this.giveFeedBack(feedBackType.BAD);
    }
    // allow for user to see feedback and move to next question
    h.postDelayed(this, 800);
}

private void changeToQuestion(int questionNumber){
    if (questionNumber >= this.questionSet.size()){
        // means we are past the question set
        // we're going to the score activity
        this.goToScoreActivity();
        return;
    }
    //clearing the check
    gr.clearCheck();
    // give change the feedback back to question
    imgFeedback.setImageResource(R.drawable.question_mark); //OTHER CODE HERE
}

run方法如下
public void run() {
        questionNumber++;
        changeToQuestion(questionNumber);
    }

最佳答案

我发现,如果一个项目被选中,并且你在广播组上调用clearCheck(),它将调用onCheckedChanged两次。第一次使用选中项的ID,第二次使用-1/View.NO_ID。imho,这是一个bug,显然它至少从1.6开始就存在了。查看此谷歌代码错误报告:http://code.google.com/p/android/issues/detail?id=4785
似乎唯一的解决方案是检查实际的RadioButton.isChecked()并测试它是真是假。这类操作违背了onCheckedChanged返回项目id的目的,因为您现在必须保留对这些按钮的引用,或者每次都调用findViewById
我怀疑他们会解决这个问题,因为更改它可能会以意想不到的方式破坏现有的代码。

07-27 17:13