web-dev-qa-db-fra.com

Création dynamique de boutons et définition de onClickListener

J'ai des problèmes avec la gestion dynamique des boutons sur Android. Je crée N boutons et je dois suivre la même méthode lorsque l’on clique sur ce bouton, mais je dois savoir sur quel bouton on clique.

for (int i = 0; i < NO_BUTTONS; i++){
        Button btn = new Button(this);
        btn.setId(2000+i);

        ...

        btn.setOnClickListener((OnClickListener) this);
        buttonList.addView(btn);
        list.add(btn);

Actuellement, j'ajoute un identifiant à chaque bouton et j'utilise la méthode ci-dessous pour voir quel bouton a été cliqué. (ligne btn.setId(2000+i); et btn.setOnClickListener((OnClickListener) this);). Cette méthode est également implémentée dans l'activité. 

@Override
public void onClick(View v) {
    switch (v.getId()){
        case 2000: selectButton(0);
        break;

        ...

        case 2007: selectButton(7);
        break;
    }
 }

Cela ne me semble pas bien alors je demande s'il y a une meilleure façon de le faire? ou comment envoyer des informations à l'événement onclick? Aucune suggestion?

25
Ante

Vous pouvez créer une méthode qui retourne un onclickListener et prend un bouton en tant que paramètre. Et ensuite, utilisez cette méthode pour définir onClicklistener dans la première boucle que vous avez. 

Mise à jour: le code pourrait être quelque chose dans ce sens:

View.OnClickListener getOnClickDoSomething(final Button button)  {
    return new View.OnClickListener() {
        public void onClick(View v) {
            button.setText("text now set.. ");    
        }
    };
}

comme une méthode dans l'activité et ensuite l'utiliser dans la boucle comme celle-ci

button.setOnClickListener(getOnClickDoSomething(button));
62
Manfred Moser

J'ai une solution pour cela ... utiliser ce code dans onCreate

linear = (LinearLayout) findViewById(R.id.linear);

LayoutParams param = new LinearLayout.LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, 1.0f);

Button[] btn = new Button[num_array_name.length];
for (int i = 0; i < num_array_name.length; i++) {
    btn[i] = new Button(getApplicationContext());
    btn[i].setText(num_array_name[i].toString());
    btn[i].setTextColor(Color.parseColor("#000000"));
    btn[i].setTextSize(20);
    btn[i].setHeight(100);
    btn[i].setLayoutParams(param);
    btn[i].setPadding(15, 5, 15, 5);
    linear.addView(btn[i]);

    btn[i].setOnClickListener(handleOnClick(btn[i]));

}

après onCreate, créez une méthode de retour, tapez View.OnClickListener comme ceci.

View.OnClickListener handleOnClick(final Button button) {
    return new View.OnClickListener() {
        public void onClick(View v) {
        }
    };
}
12
Amol Sawant TMonger
Button.OnClickListener btnclick = new Button.OnClickListener(){

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub

        Button button = (Button)v;
    Toast.makeText(getApplicationContext(), button.getText().toString(),2).show();  
    }

};

appeler cet auditeur par btn.setOnClickListener(btnclick);

5
Vicky

Les ID de vue ne doivent pas être utilisés à ces fins car les ID de vue sont générés au moment de la compilation, en fonction des ID définis dans les fichiers de présentation xml.

Placez simplement vos propres identifiants dans la méthode setTag () disponible au niveau de la vue (les boutons en héritent donc). Cette "balise" peut être tout ce qui vous permet de reconnaître une vue des autres. Vous récupérez sa valeur avec getTag ().

3
Kevin Gaudin

utilisez plutôt la fonction setTag () pour distinguer facilement.

 for(int i=0;i<4;i++) {
     Button btn = new Button(this);
     btn.setTag(i);
     btn.setOnClickListener(new View.OnclickListener() {
         @Override
         public void onClick(View v) {
             int i=v.getTag();
             switch(i) {
                 case 1: btn.setText(i);
                     break;

                 case 2: btn.setText(i);
                     break;

                 case 3: btn.setText(i);
                     break;

                 case 4: btn.setText(i);
                     break;

                 default: btn.setText("Others");
             }
         }
     }
1
Siva Chegondi
public class MainActivity extends Activity implements View.OnClickListener
{

LinearLayout linearLayout;
Button [] button;
View.OnClickListener listener;
@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    linearLayout=(LinearLayout)findViewById(R.id.parent_lay);
    String[] array={"U123","U124","U125"};
    int length=array.length;
    System.out.println("11111111111111111111111111");
    button=new Button[length];
    for(int i=0;i<length;i++)
    {
        button[i]=new Button(getApplicationContext());
        button[i].setId(i);
        button[i].setText("User" + i);
        button[i].setOnClickListener(this);
        linearLayout.addView(button[i]);
    }
}
@Override
public void onClick(View view)
{
    view.getId();
    Button button=(Button)findViewById(view.getId());
    button.setText("Changed");
}
}
0
Newbee

Il est préférable de ne pas gâcher les identifiants, les méthodes setTag et getTag ont été conçues à cet effet. C'est le moyen rapide et propre de définir un groupe d'écouteurs de boutons sur une présentation dynamique.

Cette réponse peut vous aider: https://stackoverflow.com/a/5291891/2804001

0
Victorio Monlleó

"Cela ne me va pas" pourquoi pas? ça ne marche pas? Vous pouvez également créer une variable membre statique contenant une liste de tous les boutons ajoutés, puis rechercher le bouton sur lequel vous avez cliqué dans cette liste.

0
fabio

Je ne sais pas pourquoi vous voudriez créer N boutons, il semble que votre valeur de N soit supérieure à 10 au moins, si vous n'essayez pas de les afficher tous en même temps (je veux dire les placer tous dans un seul écran , pas de défilement), vous pouvez essayer de recycler les boutons invisibles comme nous le faisons pour la vue liste à l'aide d'un détenteur de vue liste. Cela réduirait l'encombrement de votre mémoire et augmenterait les performances, et différencierait les boutons en fonction du texte que vous avez défini sur ceux-ci ou d'une balise, ou vous pouvez même faire référence à ce petit nombre de boutons.

0
srinathhs