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");
}
};
}
Ответы
Ответ 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);
}
}