radiogroup - radio group android
RadioGroup llama onCheckChanged() tres veces (4)
He estado luchando con un problema de verificación programática de un RadioButton, que está situado en un RadioGroup. Parece que una sola llamada check()
genera tres eventos: uno para el primer RadioButton y dos para el segundo, que es mi objetivo. Al mismo tiempo, al hacer clic en el segundo RadioButton en la interfaz solo aparece un evento, lo cual es correcto.
Entonces, ¿hay una manera de evitar la generación de eventos múltiples?
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");
}
};
}
Entonces, ¿hay una manera de evitar la generación de eventos múltiples?
Llame a b.setChecked(true);
en lugar.
Un vistazo rápido a través del código fuente confirma que RadioGroup#check()
realmente llama al OnCheckChangedListener tres veces ...
- Cuando la selección actual no está marcada,
- Cuando se marca el nuevo RadioButton, y
- Cuando el Grupo de Radio guarda el RadioButton ahora está marcado.
Peculiaridad extraña
Así que esta es una vieja pero también tengo un comportamiento similar. Una solución que encontré fue llamar al método toggle()
de RadioButton
lugar del método check()
de RadioGroup
.
Así que en este ejemplo, solo deberías intercambiar
r.check(R.id.radio1);
con
b.toggle();
ya que b
es ya la vista con id R.id.radio1
.
Simplemente publique su r.setOnCheckedChangeListener(onPromobuttonsClick);
línea en el método onResume()
. Me funciona a mí.
Tuve este problema cuando quería registrar los análisis para las pulsaciones de los botones de radio, pero la forma en que se manejaban las llamadas de los grupos de radio con .check()
hizo que se onCheckedChangeListener
a onCheckedChangeListener
varias veces (lo que enviaba demasiados eventos).
Lo manejé de la siguiente manera para obtener solo un evento por clic:
// 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);
}
}