2010-12-23 5 views
8

Ich habe ein Problem mit ClearChecked() von RadioGroup. Ich zeige dem Benutzer eine Multiple-Choice-Frage an und nachdem der Benutzer eine Antwort ausgewählt hat, überprüfe ich die Antwort, gebe ihm ein Feedback und gehe dann zur nächsten Frage über. Bei der nächsten Frage gehe ich zur RadioGroup.Fehler in Android ClearCheck() für RadioGroup?

Kann mir jemand erklären, warum die onCheckedChanged-Methode dreimal aufgerufen wird? Sobald die Änderung tatsächlich eintritt (mit dem Benutzer ändert sich), einmal wenn ich check (mit -1 als ausgewählte ID) und einmal dazwischen (mit dem Benutzer ändert sich)?

Soweit ich feststellen konnte, wird der zweite Trigger durch clearCheck provoziert. Code unten:

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 
} 

und die run-Methode sieht wie folgt aus

public void run() { 
     questionNumber++; 
     changeToQuestion(questionNumber); 
    } 

Antwort

18

Was ich entdeckt habe, ist, dass, wenn ein Element aktiviert ist, und Sie rufen clearCheck() im Radio Gruppe es onCheckedChanged zweimal nennen. Das erste Mal mit der ID des Artikels, der überprüft wurde und das zweite Mal mit -1/View.NO_ID. IMHO, das ist ein Fehler und anscheinend ist es seit mindestens 1.6. Siehe diesen Google Code Fehlerbericht: http://code.google.com/p/android/issues/detail?id=4785

Es scheint zu sein, dass die einzige Lösung ist, überprüfen Sie die tatsächliche RadioButton.isChecked() und testen, ob es wahr oder falsch ist. Diese Art von besiegt den Zweck der onCheckedChanged Rückgabe der ID des Elements, da Sie jetzt entweder Verweise auf diese Schaltflächen behalten oder findViewById jedes Mal aufrufen müssen.

Ich bezweifle, dass sie dies beheben werden, da die Änderung wahrscheinlich den vorhandenen Code auf unerwartete Weise brechen würde.

+0

@qbeticus Thank helfen du, ich mana ged am Ende, um eine boolesche Variable zu verwenden, um herauszufinden, ob onCheckedChanged weiterhin die ausgewählte Option auswerten soll. –

+0

Vielen Dank für die Bestätigung, dass dies ein Fehler ist, ich habe es vermutet, nachdem ich das seltsame Verhalten der Radiogruppe beobachtet hatte. –

2

Ich hatte ähnliches Problem. Meine Lösung:

in Verfahren:

public void onCheckedChanged(RadioGroup rGroup, int checkedId) 

ich überprüfen checkedId. Es entspricht -1, wenn Sie clearCheck() verwenden, sonst entspricht es ausgewählten Radiogruppe Kind

11

Ich konfrontiert das gleiche Problem, und ich löste mit anderen Work-Around.

  1. Set CheckedChangeListener als NULL
  2. Ihren Betrieb tun
  3. wieder Ihre OnCheckedChangeListener zurücksetzen

-Code snnipet:

rdbGroup.setOnCheckedChangeListener(null); 
rdbGroup.clearCheck(); 
rdbGroup.setOnCheckedChangeListener(checkedChangeListener); 

hoffen, dass dies ツ

+1

tolle Arbeit herum! Danke vielmals :) –

Verwandte Themen