2012-04-21 20 views
19

He estado luchando con un problema de comprobación programática de un RadioButton, que está situado en un RadioGroup. Parece que una sola llamada check() plantea tres eventos: una para el primer RadioButton y dos veces para el segundo, que es mi objetivo. Al mismo tiempo, al hacer clic en el segundo RadioButton en la interfaz, solo aparece un evento, que es correcto.RadioGroup llama aCheckChanged() tres veces

Entonces, ¿hay alguna forma 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"); 
     } 
    }; 
} 

Respuesta

39

Entonces, ¿hay una manera de evitar la multiplicidad de evento de recaudación?

En su lugar, llame al b.setChecked(true);.


Una mirada rápida a través de la source code confirma que RadioGroup#check() realmente llamar a los OnCheckChangedListener tres veces ...

  1. Cuando la selección actual está marcada,
  2. Cuando se marca la nueva RadioButton, y
  3. Cuando RadioGroup guarda qué RadioButton está ahora marcado.

Odd quirk.

+0

Sir: Necesitamos su ayuda .Tomar un vistazo favor http://stackoverflow.com/questions/22602559/how-do- implement-this-in-android –

+1

Realmente salvó mi vida ... Excelente @Sam –

+0

Por favor, elabore la respuesta más. No recibo tu respuesta. –

2

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

0

Así que este es un antiguo pero también tengo un comportamiento similar. Una solución que encontré fue llamar al método toggle() de RadioButton en lugar del método check() de RadioGroup.

lo tanto, en este ejemplo, woulod sólo tiene que cambiar

r.check(R.id.radio1); 

con

b.toggle(); 

desde b ya es la vista con id R.id.radio1.

0

Tuve este problema cuando quise registrar analíticas para presionar botones de radio, pero la forma en que se manejaban las llamadas de grupos de radio con .check() provocó que onCheckedChangeListener se llamaran varias veces (lo que envió demasiados eventos).

lo manejé la siguiente manera sólo para conseguir 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); 
    } 
} 
Cuestiones relacionadas