RadioGroup llama a onCheckChanged () tres veces

He estado luchando con un problema de control programático de un RadioButton, que está situado en un RadioGroup. Parece que una sola llamada check() lanza tres eventos – una vez para el primer RadioButton y dos veces para el segundo, que es mi objetivo. Al mismo tiempo, haciendo clic en el segundo RadioButton en la interfaz hace que aparezca sólo un evento, lo cual es correcto.

Por lo tanto, hay una manera de evitar la multiplicació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"); } }; } 

Por lo tanto, hay una manera de evitar la multiplicación de eventos múltiples?

Llamar b.setChecked(true); en lugar.


Una mirada rápida a través del código fuente confirma que RadioGroup#check() realmente llama al OnCheckChangedListener tres veces …

  1. Cuando la selección actual está desactivada,
  2. Cuando se comprueba el nuevo RadioButton, y
  3. Cuando RadioGroup guarda qué RadioButton está marcado.

Curiosidad extraña.

Simplemente publique su r.setOnCheckedChangeListener(onPromobuttonsClick); Línea en el método onResume() . Es trabajos para mí.

Así que este es un viejo, 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, sólo tendrías que cambiar

 r.check(R.id.radio1); 

con

 b.toggle(); 

Ya que b ya es la vista con id R.id.radio1 .

Tuve este problema cuando quería registrar el análisis de las pulsaciones de botones de radio, pero la forma en que las llamadas de los grupos de radio se estaban manejando con .check() causado onCheckedChangeListener para llamar varias veces (que envió demasiados eventos).

Lo manejé de la siguiente manera para obtener sólo 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); } } 
  • RadioButton con vista personalizada de Android
  • Radiogrupo Android, divisor entre los botones de radio
  • android onCheckedChanged para el radiogrupo
  • Diseño personalizado para RadioButton
  • grupo de radio setOnCheckedChangeListener
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.