2010-09-25 12 views
46

mi ritrovo a fare le cose in questo modo tutto il tempo:Una OnClickHandler per più pulsanti

Button button1 = (Button) findViewById(R.id.button1); 
    Button button2 = (Button) findViewById(R.id.button2); 
    Button button3 = (Button) findViewById(R.id.button3); 

    button1.setOnClickListener(menuButtonListener); 
    button2.setOnClickListener(menuButtonListener); 
    button3.setOnClickListener(menuButtonListener); 
... 

e

private OnClickListener myButtonListener = new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
     switch(v.getId()){ 
     case R.id.button1 : 
    ... 

C'è un modo migliore per impostare l'OnClickListener?

risposta

59

Puoi anche impostarlo nel tuo layout xml utilizzando l'attributo android: onclick.

android:onClick="onClick" 

Quindi nella classe di attività aggiungere il metodo onClick.

public void onClick(View v) { 
... 

Ecco il numero documentation.

+0

Ah, bello :) Breve ed efficace. Mi piace! – mseo

+1

Cosa succede se i pulsanti vengono creati dinamicamente? – Orion

+1

@Orion Sia questo approccio sia l'approccio di mseo funzioneranno anche per i pulsanti creati dinamicamente. – Tiago

35

avere la vostra classe di implementare `View.OnClickListener', come

public class MyActivity extends Activity implements View.OnClickListener { 

    Button button1, button2, button3; 

    @Override 
    public void onCreate(Bundle bundle) { 
     super.onCreate(); 

     ... 

     button1 = (Button) findViewById(R.id.button1); 
     button2 = (Button) findViewById(R.id.button2); 
     button3 = (Button) findViewById(R.id.button3); 

     button1.setOnClickListener(this); 
     button2.setOnClickListener(this); 
     button3.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 
     switch(v.getId()) { 
      case R.id.button1: 
      // do stuff; 
      break; 
      case R.id.button2: 
      // do stuff; 
      break; 
     ... 
    } 
} 
+1

Beh ... non mi risparmia molto lavoro. È un'altra possibilità di farlo, ma non è molto più breve o più elegante del mio approccio. – mseo

+0

Questo sembra funzionare bene per Attività Estendere Frammenti – CelticParser

+0

hanno apprezzato! Come funziona però ...? –

4

Va notato, che

android:onclick="onClick" 

richiede SDK almeno Andoid 1.6. Quindi, se vuoi che la tua app sia accessibile al maggior numero possibile di pubblico, probabilmente vorrai scrivere la tua app su Android 1.6. A meno che la tua app non richieda una funzionalità disponibile solo nella versione 1.6+. Così mentre il tuo primo tentativo è un po 'più di lavoro, ha una maggiore compatibilità con le versioni precedenti. Di solito lo faccio nel modo in cui lo fai, per mantenere la mia app 1.5 compatibile.

Modifica: È facile trascurare questo, se si imposta Android 2.2 come SDK nelle impostazioni del progetto, ma impostare la versione minSDK su 3 (1.5), in quanto non fornisce errori del compilatore.

1

Credo che nel caso, quando i pulsanti non sono in attività, ma in FragmentDialog, ecc, questo può aiutare

Context mContext = getActivity().getBaseContext(); 
mRes = mContext.getResources(); 
String[] idOfButtons = { "button1", "button2", "button3"}; 
for (int pos = 0; pos < idOfButtons.length; pos++) { 
    Integer btnId = mRes.getIdentifier(idOfButtons[pos], "id",(getActivity()).getBaseContext().getPackageName()); 
    ImageButton ib = (ImageButton) v.findViewById(btnId); 
    ib.setOnClickListener(this.onClickNum); 
} 
5

Gettin @foenix risposta, si può semplicemente fare qualcosa di simile:

int[] buttons = {R.id.button1, R.id.button2, R.id.button3, R.id.button4, R.id.button5, R.id.button6, R.id.button7 
      , R.id.button8, R.id.button9}; 
    for (int i = 0; i < buttons.length; i++) { 
     Button buttonNum = (Button) rootView.findViewById(buttons[i]); 
     buttonNum.setOnClickListener(doSomething); 
    } 

private OnClickListener doSomething= new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
      //doSomething 
    } 
}; 
0

Se si vuole fare meno codice per gli ascoltatori click avete questo lib [http://jakewharton.github.io/butterknife/]

devi solo fare questo

@OnClick({ R.id.button1, R.id.button2, R.id.button3 }) 
public void doSomething(View button) { 
    //do whatever you want 
    button.changeWhateverInTheView(); 
} 
Problemi correlati