webentwicklung-frage-antwort-db.com.de

Buttons dynamisch erstellen und onClickListener einstellen

Ich habe Probleme mit dynamisch erzeugten Buttons auf Android. Ich erstelle N-Buttons und muss dieselbe Methode ausführen, wenn der Button angeklickt wird, aber ich muss wissen, welcher Button angeklickt wird.

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

Gleichzeitig füge ich jeder Schaltfläche eine ID hinzu und verwende die Methode unten, um zu sehen, welche Schaltfläche angeklickt wurde. (Zeile btn.setId(2000+i); und btn.setOnClickListener((OnClickListener) this);). Diese Methode wird auch in der Aktivität implementiert. 

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

        ...

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

Das sieht für mich nicht gut aus, also frage ich mich, ob es einen besseren Weg gibt, dies zu tun? oder wie Sie einige Informationen an onclick event senden können? irgendwelche Vorschläge?

25
Ante

Sie können eine Methode erstellen, die einen onclickListener zurückgibt und eine Schaltfläche als Parameter verwendet. Und dann verwenden Sie diese Methode, um den onClicklistener in der ersten vorhandenen Schleife festzulegen. 

Update: Code könnte in etwa so aussehen:

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

als Methode in der Aktivität und dann in der Schleife wie folgt verwenden

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

Ich habe eine Lösung dafür bekommen .. Verwenden Sie diesen Code in 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]));

}

erstellen Sie nach onCreate eine Methode des Rückgabetyps View.OnClickListener wie folgt.

View.OnClickListener handleOnClick(final Button button) {
    return new View.OnClickListener() {
        public void onClick(View v) {
        }
    };
}
12
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();  
    }

};

rufen Sie diesen Listener mit btn.setOnClickListener(btnclick); auf.

5
Vicky

Ansichts-IDs sollten nicht für diese Zwecke verwendet werden, da Ansichts-IDs zum Zeitpunkt der Kompilierung abhängig von den in XML-Layoutdateien definierten IDs generiert werden.

Fügen Sie einfach Ihre eigenen IDs in die setTag () -Methode ein, die auf der Ansichtsebene verfügbar ist (so übernehmen Buttons diese). Dieses "Tag" kann alles sein, was es Ihnen ermöglicht, eine Ansicht von anderen zu erkennen. Sie erhalten den Wert mit getTag ().

3
Kevin Gaudin

verwenden Sie stattdessen die Funktion setTag (), um sich leicht zu unterscheiden.

 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

Es ist vorzuziehen, sich nicht mit den ids zu beschäftigen, die setTag- und getTag-Methoden wurden für diesen Zweck entwickelt. Dies ist die schnelle und saubere Methode, eine Reihe von Tasten-Zuhörern auf ein dynamisches Layout festzulegen

Diese Antwort kann Ihnen helfen: https://stackoverflow.com/a/5291891/2804001

0

"Das sieht für mich nicht gut aus" warum nicht? funktioniert es nicht? Sie können auch eine statische Elementvariable erstellen, die eine Liste aller hinzugefügten Schaltflächen enthält, und dann stattdessen nach der angeklickten Schaltfläche in dieser Liste suchen.

0
fabio

Ich weiß nicht, warum Sie N-Schaltflächen erstellen möchten. Der Wert von N ist mindestens größer als 10, wenn Sie nicht versuchen, alle auf einmal zu zeigen (ich meine, alle auf einen einzigen Bildschirm passen) (kein Scrollen) Sie könnten versuchen, die unsichtbaren Schaltflächen zu recyceln, genauso wie wir es für die Listenansicht mit einem Listenansicht-Inhaber tun. Dies würde Ihren Speicherbedarf verringern und die Leistung steigern. Die Schaltflächen werden entweder aufgrund des von Ihnen festgelegten Textes oder eines Tags unterschieden, oder Sie können sogar einen Verweis auf diese kleine Anzahl von Schaltflächen halten.

0
srinathhs