2012-04-21 9 views
19

Ho avuto problemi con un problema di controllo programmatico di un RadioButton, che si trova in un Gruppo Radio. Sembra che una singola chiamata check() sollevi tre eventi: una volta per il primo RadioButton e due volte per il secondo, che è il mio obiettivo. Allo stesso tempo, facendo clic sul secondo pulsante Radio dell'interfaccia, viene visualizzato un solo evento, che è corretto.RadioGroup chiamaCheckChanged() tre volte

Quindi, c'è un modo per evitare l'innalzamento di eventi multipli?

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"); 
     } 
    }; 
} 

risposta

39

Quindi, c'è un modo per evitare multiple di incremento di eventi?

Chiama il numero b.setChecked(true);.


Un rapido sguardo attraverso il source code conferma che RadioGroup#check() fa davvero chiamare i OnCheckChangedListener tre volte ...

  1. Quando la selezione corrente non è selezionata,
  2. Quando la nuova RadioButton è selezionata, e
  3. Quando il Gruppo Radio salva quale RadioButton è ora controllato.

strana stranezza.

+0

Sir: bisogno del vostro aiuto .Prendere uno sguardo prega http://stackoverflow.com/questions/22602559/how-do- implement-this-in-android –

+1

Davvero salvata la mia vita ... Superba @Sam –

+0

Per favore rispondi di più. Non ricevo la tua risposta. –

2

Pubblicare semplicemente la riga r.setOnCheckedChangeListener(onPromobuttonsClick); nel metodo onResume(). Funziona per me.

0

Quindi questo è vecchio ma ho anche avuto un comportamento simile. Una soluzione alternativa che ho trovato era chiamare il metodo toggle() di RadioButton anziché il metodo check() di RadioGroup.

Quindi, in questo esempio, è woulod solo bisogno di scambiare

r.check(R.id.radio1); 

con

b.toggle(); 

dal b è già la vista con id R.id.radio1.

0

Ho riscontrato questo problema quando volevo registrare l'analitica per le pressioni di pulsanti radio, ma il modo in cui le chiamate dei gruppi radio venivano gestite con .check() provocava il richiamo di onCheckedChangeListener più volte (che inviava troppi eventi).

ho gestito nel modo seguente per ottenere un solo evento per click:

// 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); 
    } 
}