Подтвердить что ты не робот

RadioGroup вызывает onCheckChanged() три раза

Я боролся с проблемой программной проверки RadioButton, которая находится в RadioGroup. Кажется, что один вызов check() вызывает три события - один раз для первого RadioButton и два раза для второго, что является моей целью. В то же время нажатие на второе RadioButton в интерфейсе вызывает только одно событие, которое является правильным.

Итак, есть ли способ избежать множественного повышения событий?

public class RadiogroupActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        RadioGroup r = (RadioGroup) findViewById(R.id.radioGroup1);
        RadioButton b = (RadioButton) findViewById(R.id.radio1);
        r.setOnCheckedChangeListener(onPromobuttonsClick);
        r.check(R.id.radio1);

    }

    private OnCheckedChangeListener onPromobuttonsClick = new OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(RadioGroup group, int checkedId) {
            Log.d("x", "x");
        }
    };
}
4b9b3361

Ответ 1

Итак, есть ли способ избежать множественного повышения событий?

Вызовите b.setChecked(true);.


Быстрый просмотр исходного кода подтверждает, что RadioGroup#check() действительно вызывает OnCheckChangedListener три раза...

  • Если текущий выбор не установлен,
  • Когда установлен новый флажок RadioButton и
  • Когда RadioGroup сохраняет, что RadioButton теперь проверяется.

Нечетная причуда.

Ответ 2

Просто разместите свою строку r.setOnCheckedChangeListener(onPromobuttonsClick); в onResume(). Это работает для меня.

Ответ 3

Итак, это старый, но у меня тоже такое поведение. Обходной путь, который я нашел, заключался в вызове метода toggle() RadioButton вместо метода check() RadioGroup.

Итак, в этом примере вам просто нужно поменять

r.check(R.id.radio1);

с

b.toggle();

так как b уже является представлением с id R.id.radio1.

Ответ 4

У меня возникла такая проблема, когда я захотел зарегистрировать аналитику для радиокнопки, но способ, которым звонили группы радиосвязи, обрабатывался с помощью .check(), вызвал onCheckedChangeListener, чтобы вызвать вызванное несколько раз (которое отправило слишком много событий).

Я обработал его следующим образом, чтобы получить только одно событие за клик:

// create listeners so we don't duplicate the creation in for loop
View.OnClickListener onClickListener = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // whatever you want to do here
    }
};

// add on click listener to all radio buttons
int buttonCount = buttonGroup.getChildCount();
for (int i = 0; i < buttonCount; i++) {
    if (buttonGroup.getChildAt(i) instanceof RadioButton) {
        buttonGroup.getChildAt(i).setOnClickListener(onClickListener);
    }
}