2010-12-23 13 views
8

Tengo un problema con clearChecked() de RadioGroup. Le estoy mostrando una pregunta de opción múltiple al usuario y luego de que el usuario selecciona una respuesta, verifico la respuesta, le doy algunos comentarios y luego paso a la siguiente pregunta. En el proceso de pasar a la siguiente pregunta, verifico ClearCheck en RadioGroup.Error en clearCheck de Android() para RadioGroup?

¿Alguien me puede explicar por qué el método onCheckedChanged se llama 3 veces? Una vez que ocurre realmente el cambio (con el usuario cambia), una vez cuando borro (compruebo con -1 como el ID seleccionado) y una vez en el medio (con el usuario cambia de nuevo)?

Por lo que pude ver, el segundo disparador es provocado por clearCheck. Código de abajo:

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 
} 

y el método de ejecución se ve así

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

Respuesta

18

Lo que he descubierto es que si un artículo se comprueba y se llama clearCheck() en el grupo de radio se llamará onCheckedChanged dos veces. La primera vez con la identificación del artículo que se verificó y la segunda vez con -1/View.NO_ID. En mi humilde opinión, este es un error y aparentemente ha existido desde al menos 1.6. Ver este informe de código de error de Google: http://code.google.com/p/android/issues/detail?id=4785

Parece ser que la única solución es comprobar el RadioButton.isChecked() real y probar si es verdadero o falso. Este tipo de derrota el propósito de onCheckedChanged devolver el id del elemento ya que ahora debe mantener referencias a esos botones o llamar al findViewById cada vez.

Dudo que arreglen esto ya que cambiarlo probablemente rompería el código existente de formas inesperadas.

+0

Gracias @qbeticus tú, yo maná ged al final para usar una variable booleana para determinar si onCheckedChanged debería continuar evaluando la opción marcada. –

+0

Gracias por confirmar que esto es un error, lo estaba sospechando después de ver el extraño comportamiento del radiogrupo. –

2

Tuve un problema similar. Mi solución:

en el procedimiento:

public void onCheckedChanged(RadioGroup rGroup, int checkedId) 

verifico checkedId. Es igual a -1 si usa clearCheck() de lo contrario equivale al grupo de radio seleccionado

11

Me enfrenté al mismo problema y lo resolví con otro trabajo alternativo.

  1. Conjunto CheckedChangeListener como NULL
  2. Haga su funcionamiento
  3. Restablecer el OnCheckedChangeListener nuevo

Código snnipet:

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

la esperanza que esto ayudará ツ

+1

increíble trabajo alrededor! Muchas gracias :) –

Cuestiones relacionadas