46 votes

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?

59voto

aprock Points 1114

Vous pouvez également le définir dans votre mise en page XML avec 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 .

35voto

cfei Points 692

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

5voto

sagits Points 188

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

4voto

Tseng Points 2687

Il convient de noter, que

android:onclick="onClick"

nécessite au moins Android SDK 1.6. Donc, si vous voulez que votre Application soit accessible au plus grand public possible, vous voudrez probablement pour écrire votre Application contre Android 1.6. À moins que votre Application nécessite une fonctionnalité qui est disponible uniquement en 1.6+. Donc, même si votre première tentative est un peu plus de travail, il a plus de rétro-compatibilité. J'ai l'habitude de le faire de la manière que vous faites, pour garder mes Applications de 1,5 comptaible.

Edit: Il est facile de négliger cela, si vous configurez Android 2.2 SDK dans vos projets de paramètres, mais minSDK version 3 (1.5), car il ne donne pas d'erreurs du compilateur.

1voto

Foenix Points 181

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X