web-dev-qa-db-fra.com

Android Button setOnClickListener Design

Je construis une Android Application. J'ai remarqué que je crée de nombreuses répétitions de code similaire à celui-ci dans chacune de mes classes:

Button buttonX = (Button)findViewById(R.id.buttonXName);
// Register the onClick listener with the implementation above
buttonX.setOnClickListener(new OnClickListener() {
    public void onClick(View v)
    {
        //DO SOMETHING! {RUN SOME FUNCTION ... DO CHECKS... ETC}
    } 
});

J'ai maintenant quinze boutons et cela rend mon code laid. Quelqu'un at-il un cours ou des exemples sur la façon de transformer tous ces codes en quelque chose de plus efficace, pour que je puisse:

  1. Créer l'objet bouton {Button buttonX (Button)findViewById(R.id.buttonXName);}
  2. Définir le listener {buttonX.setOnClickListener(new OnClickListener()}
  3. Déterminez si vous avez cliqué sur {public void onClick(View v)}
  4. Ensuite, exécutez un code spécifique pour chaque bouton?

Si quelqu'un sait quelque chose, je l'apprécierais.

43
user591162

Si vous ciblez 1.6 ou une version ultérieure, vous pouvez utiliser Android: attribut xml onClick pour supprimer une partie du code répétitif. Voir cet article de blog par Romain Guy.

<Button 
   Android:height="wrap_content"
   Android:width="wrap_content"
   Android:onClick="myClickHandler" />

Et dans la classe Java, utilisez les lignes de code ci-dessous:

class MyActivity extends Activity {
    public void myClickHandler(View target) {
        // Do stuff
    }
}
52
dgmltn

Implémentez OnClickListener () sur votre activité ...

public class MyActivity extends Activity implements View.OnClickListener {
}

Pour chaque bouton, utilisez ...

buttonX.setOnClickListener(this);

Dans votre test de méthode Activity onClick () pour quel bouton il s'agit ...

@Override
public void onClick(View view) {
    if (View.equals(buttonX))
        // Do something
}

Également dans onClick, vous pouvez utiliser view.getId () pour obtenir l'ID de la ressource, puis l'utiliser dans un bloc switch/case pour identifier chaque bouton et effectuer l'action appropriée.

27
Squonk

Solution lambada Android

public void registerButtons(){
    register(R.id.buttonName1, ()-> {/*Your code goes here*/});
    register(R.id.buttonName2, ()-> {/*Your code goes here*/});
    register(R.id.buttonName3, ()-> {/*Your code goes here*/});
}

private void register(int buttonResourceId, Runnable r){
    findViewById(buttonResourceId).setOnClickListener(v -> r.run());
}

Solution de cas de commutation

public void registerButtons(){
    register(R.id.buttonName1);
    register(R.id.buttonName2);
    register(R.id.buttonName3);
}

private void register(int buttonResourceId){
    findViewById(buttonResourceId).setOnClickListener(buttonClickListener);
}

private OnClickListener buttonClickListener = new OnClickListener() {

    @Override
    public void onClick(View v){
        switch (v.getId()) {
            case R.id.buttonName1:
                // TODO Auto-generated method stub
                break;
            case R.id.buttonName2:
                // TODO Auto-generated method stub
                break;
            case View.NO_ID:
            default:
                // TODO Auto-generated method stub
                break;
        }
    }
};
10
Ilya Gazman

Puisque setOnClickListener est défini sur View pas Button, si vous n'avez pas besoin de la variable pour autre chose, vous pouvez le rendre un peu plus agile comme ceci:

findViewById(R.id.buttonXName).setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
    //DO SOMETHING! {RUN SOME FUNCTION ... DO CHECKS... ETC}
    } 
});
9
Jim Blackler

Vous pouvez utiliser array pour gérer plusieurs écouteurs de clic de bouton dans Android comme ceci: je suis en train de configurer l'écouteur de clic de bouton pour n boutons en utilisant array comme:

Button btn[] = new Button[n]; 

NOTE: n est un entier positif constant

Exemple de code:

//class androidMultipleButtonActions 
package a.b.c.app;

import Android.app.Activity;
import Android.os.Bundle;
import Android.view.View;
import Android.view.View.OnClickListener;
import Android.widget.Button;

public class androidMultipleButtonActions extends Activity implements OnClickListener{
    Button btn[] = new Button[3];

    public void onCreate(Bundle savedInstanceState) {   
    super.onCreate(savedInstanceState);
        setContentView(R.layout.main);        
        btn[0] = (Button) findViewById(R.id.Button1);
        btn[1] = (Button) findViewById(R.id.Button2);
        btn[2] = (Button) findViewById(R.id.Button3);
        for(int i=0; i<3; i++){
            btn[i].setOnClickListener(this);
        }           
    }

    public void onClick(View v) {
        if(v == findViewById(R.id.Button1)){
            //do here what u wanna do.
        }
        else if(v == findViewById(R.id.Button2)){
            //do here what u wanna do.
        }
        else if(v == findViewById(R.id.Button3)){
            //do here what u wanna do.
        }
    }
}

Remarque: écrivez d’abord un fichier main.xml si vous ne savez pas écrire, envoyez un mail à: [email protected]

6
Wesagn

Je pense que vous pouvez généralement faire ce dont vous avez besoin dans une boucle, ce qui est bien meilleur que beaucoup de méthodes onClick si cela peut être fait.

Départ cette réponse pour une démonstration de l'utilisation d'une boucle pour un problème similaire. La manière dont vous construirez votre boucle dépendra des besoins de vos fonctions onClick et de leur ressemblance. Le résultat final est un code beaucoup moins répétitif et plus facile à gérer.

3
Matthew Willis

Mettre en œuvre l'activité avec View.OnClickListener comme ci-dessous.

public class MyActivity extends AppCompatActivity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_scan_options);

        Button button = findViewById(R.id.button);
        Button button2 = findViewById(R.id.button2);

        button.setOnClickListener(this);
        button2.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {

        int id = view.getId();

        switch (id) {

            case R.id.button:

                  // Write your code here first button

                break;

             case R.id.button2:

                  // Write your code here for second button

                break;

        }

    }

}
1
yatin deokar
public class MyActivity extends AppCompatActivity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_scan_options);

        Button button = findViewById(R.id.button);
        Button button2 = findViewById(R.id.button2);

        button.setOnClickListener(this);
        button2.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {

        int id = view.getId();

        switch (id) {

            case R.id.button:

                  // Write your code here first button

                break;

             case R.id.button2:

                  // Write your code here for second button

                break;

        }

    }

}
1
raju dhiraj
public class MainActivity extends AppCompatActivity  implements View.OnClickListener{

    Button b1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        b1=(Button)findViewById(R.id.button);
        b1.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        Toast.makeText(getApplicationContext(),"Button is Working",Toast.LENGTH_LONG).show();
    }

}
1
Anil