web-dev-qa-db-fra.com

Un OnClickHandler pour plusieurs boutons

Je me retrouve à faire des choses comme ça tout le temps:

    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);
...

et

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

Existe-t-il un meilleur moyen de définir OnClickListener?

46
mseo

Vous pouvez également le définir dans votre mise en page XML à l'aide de l'attribut Android: onclick.

Android:onClick="onClick"

Ajoutez ensuite la méthode onClick dans votre classe d’activité. 

public void onClick(View v) {
...

Voici la documentation .

59
aprock

Demandez à votre classe d'implémenter View.OnClickListener, comme

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;
       ...
   }
}
35
Chris Fei

Gettin @foenix, vous pouvez simplement faire quelque chose comme:

    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
   }
};
5
sagits

Il convient de noter que 

Android:onclick="onClick"

nécessite au moins Andoid SDK 1.6. Donc, si vous voulez que votre application soit accessible au plus grand public possible, vous voudrez probablement l'écrire contre Android 1.6. Sauf si votre application nécessite une fonctionnalité uniquement disponible dans la version 1.6+. Ainsi, bien que votre première tentative consomme un peu plus de travail, elle offre une compatibilité ascendante plus grande. Je le fais habituellement comme vous le faites, pour maintenir la compatibilité de mon logiciel Apps 1.5.

Il est facile d’ignorer cela, si vous configurez Android 2.2 comme SDK dans les paramètres de votre projet, mais réglez la version de minSDK sur 3 (1.5), car cela ne génère pas d’erreurs de compilation. 

4
Tseng

Je pense que dans le cas où vos boutons ne sont pas dans Activité mais dans FragmentDialog, etc., cela peut aider

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);
}
1
Foenix

Si vous voulez faire moins de code pour les écouteurs de clic, vous avez cette lib [ http://jakewharton.github.io/butterknife/]

tu dois juste faire ça 

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