Ошибка в Android clearCheck () для RadioGroup? - PullRequest
9 голосов
/ 23 декабря 2010

У меня проблема с clearChecked () RadioGroup. Я показываю пользователю вопрос с несколькими вариантами ответов, и после того, как пользователь выбирает ответ, я проверяю ответ, даю ему некоторую обратную связь и затем перехожу к следующему вопросу. В процессе перехода к следующему вопросу я убираю флажок в RadioGroup.

Может кто-нибудь объяснить мне, почему метод onCheckedChanged вызывается 3 раза? Один раз, когда изменение действительно происходит (с изменениями пользователя), один раз, когда я очищаюCheck (с -1 в качестве выбранного идентификатора) и один раз между (с изменением пользователя)?

Насколько я могу судить, второй триггер спровоцирован 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
}

и метод запуска выглядит следующим образом

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

Ответы [ 3 ]

23 голосов
/ 30 декабря 2010

Я обнаружил, что если пункт проверен, и вы вызываете clearCheck() в группе радиосвязи, он будет вызывать onCheckedChanged дважды.Первый раз с идентификатором предмета, который был проверен, и второй раз с -1 / View.NO_ID.ИМХО, это ошибка и, видимо, она существует примерно с 1.6.См. Этот отчет об ошибке в коде Google: http://code.google.com/p/android/issues/detail?id=4785

Похоже, что единственным решением является проверка фактического RadioButton.isChecked() и проверка, является ли оно истинным или ложным.Такого рода поражение цели onCheckedChanged возврата идентификатора элемента, так как теперь вы должны либо сохранять ссылки на эти кнопки, либо каждый раз вызывать findViewById.

Я сомневаюсь, что это исправят после измененияэто, вероятно, сломало бы существующий код неожиданными способами.

14 голосов
/ 26 мая 2015

Я столкнулся с той же проблемой, и я решил с другим обходным путем.

  1. Установить CheckedChangeListener как NULL
  2. Сделай свою операцию
  3. Сброс вашего OnCheckedChangeListener снова

Код сннипета:

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

Надеюсь, это поможет 101

1 голос
/ 23 сентября 2012

У меня была похожая проблема.Мое решение:

в процедуре:

public void onCheckedChanged(RadioGroup rGroup, int checkedId)

Я проверяю CheckId.Он равен -1, если вы используете clearCheck (), иначе он равен выбранному дочернему элементу радиогруппы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...