我遇到了RadioGroup的clearChecked()问题。我正在向用户显示一个多项选择题,在用户选择答案后,我会检查答案,给他一些反馈,然后转到下一个问题。在转到下一个问题的过程中,我清楚检查RadioGroup。
有人可以向我解释为什么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);
}
答案 0 :(得分:23)
我发现如果检查了某个项目,并且您在广播组上呼叫clearCheck()
,则会拨打onCheckedChanged
两次。第一次使用已检查项目的ID,第二次使用-1
/ View.NO_ID
。恕我直言,这是一个错误,显然它已经存在至少1.6。请参阅此Google代码错误报告:http://code.google.com/p/android/issues/detail?id=4785
似乎唯一的解决方案是检查实际的RadioButton.isChecked()
并测试它是真还是假。这种方式违背了onCheckedChanged
返回项目ID的目的,因为您现在必须保留对这些按钮的引用或每次都调用findViewById
。
我怀疑他们会解决这个问题,因为改变它可能会以意想不到的方式破坏现有代码。
答案 1 :(得分:14)
我遇到了同样的问题,我解决了其他问题。
rdbGroup.setOnCheckedChangeListener(null);
rdbGroup.clearCheck();
rdbGroup.setOnCheckedChangeListener(checkedChangeListener);
希望这会有助于ツ
答案 2 :(得分:1)
我有类似的问题。我的解决方案:
程序中的:
public void onCheckedChanged(RadioGroup rGroup, int checkedId)
我检查了checkedId。如果你使用clearCheck()它等于-1 否则它等于选定的无线电组孩子