Question

J'ai un problème avec la manipulation des boutons dynamiquement créés sur Android. Je crée des boutons N et je dois faire la même méthode lorsque le bouton est cliqué, mais je dois savoir qui clique sur le bouton.

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

Cucurrently J'ajoute ID à chaque bouton et j'utilise la méthode ci-dessous pour voir quel bouton a été cliqué. (Line btn.setId(2000+i); et btn.setOnClickListener((OnClickListener) this);). Cette méthode est également mis en œuvre dans l'activité.

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

        ...

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

Cela ne semble pas bon pour moi donc je vous demande est-il une meilleure façon de le faire? ou comment envoyer des informations à l'événement onclick? des suggestions?

Était-ce utile?

La solution

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

Mise à jour: code pourrait être soemthing le long de ces lignes:

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

en tant que procédé à l'activité et ensuite l'utiliser dans la boucle de ce type

button.setOnClickListener(getOnClickDoSomething(button));

Autres conseils

Je suis 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éer une méthode de type retour View.OnClickListener comme ça ..

View.OnClickListener handleOnClick(final Button button) {
    return new View.OnClickListener() {
        public void onClick(View v) {
        }
    };
}
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 écouteur par btn.setOnClickListener(btnclick);

Voir ID ne doivent pas être utilisés à ces fins que Voir Ids sont générés sur le temps de compilation en fonction des ID définies dans les fichiers de mise en page XML.

Il suffit de placer vos propres ID dans la méthode setTag () qui est disponible au niveau de la vue (si les boutons les hériteront). Cette « étiquette » peut être tout ce que vous permettent de reconnaître une vue à partir d'autres. Vous récupérez sa valeur avec getTag ().

utiliser à la place la fonction setTag () pour facilement distinct.

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

« Cela ne semble pas bon pour moi » pourquoi pas? ça ne marche pas? Vous pouvez également créer une variable membre statique tenant une liste de tous les boutons ajoutés, puis recherchez le bouton cliqué dans cette liste à la place.

Je ne sais pas pourquoi vous voulez créer des boutons N, il ressemble à votre valeur de N est supérieur à 10 au moins, si vous essayez de ne pas les montrer à la fois (je veux dire adapter tous en un écran unique, pas de défilement), vous pouvez essayer de recycler les boutons invisibles comme nous le faisons pour une vue de la liste en utilisant un support d'affichage de liste. Cela permettrait de réduire votre empreinte mémoire et améliorer les performances, et différencier les boutons en fonction soit sur le texte que vous définissez sur eux ou un tag ou vous pouvez même tenir une référence à ceux petit nombre de boutons.

est préférable de ne pas gâcher les ids, setTag et getTag ont été conçus à cet effet, il est le moyen rapide et propre à mettre un tas de boutons auditeurs sur une mise en page dynamique

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

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");
}
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top