Frage

Ich habe Probleme mit auf Android dynamisch erstellt Buttons Handhabung. Ich erstelle N Tasten und ich habe die gleiche Methode zu tun, wenn die Schaltfläche geklickt wird, aber ich muß wissen, welche Schaltfläche geklickt 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);

Cucurrently Ich füge ID für jeden Knopf und ich bin mit der Methode unten, um zu sehen, welche Schaltfläche geklickt wurde. (Line btn.setId(2000+i); und btn.setOnClickListener((OnClickListener) this);). Diese Methode wird auch in der Aktivität umgesetzt.

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

        ...

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

Das sieht nicht gut zu mir, damit ich bin gefragt gibt es eine bessere Möglichkeit, dies zu tun? oder wie einige Informationen zu Onclick-Ereignis senden? irgendwelche Vorschläge?

War es hilfreich?

Lösung

Sie können eine Methode erstellen, die eine OnClickListener zurückgibt und einen Knopf als Parameter. Und dann diese Methode verwenden, um die OnClickListener in der ersten Schleife setzen Sie haben ..

Update: Code entlang dieser Linien soemthing werden:

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

als ein Verfahren in der Aktivität und es dann so in der Schleife verwenden

button.setOnClickListener(getOnClickDoSomething(button));

Andere Tipps

habe ich eine Lösung für dieses .. 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]));

}

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

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

};

nennen diesen Hörer durch btn.setOnClickListener(btnclick);

View-IDs sollte nicht für diese Zwecke verwendet wird als Ansicht Ids auf der Kompilierung erzeugt werden, abhängig von IDs in XML-Layout-Dateien definiert.

Legen Sie einfach Ihre eigene IDs in dem setTag () -Methode, die auf Ansichtsebene verfügbar ist (so Buttons sie erben). Dieser „Tag“ kann alles sein, mit denen Sie einen Blick von anderen zu erkennen. Sie rufen seinen Wert mit getTag ().

stattdessen setTag () Funktion zu deutlichen leicht.

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

„Das sieht nicht gut zu mir“ warum nicht? funktioniert es nicht? Sie können auch eine statische Membervariable eine Liste aller hinzugefügt Schaltflächen erstellen zu halten, und dann stattdessen in dieser Liste für die klickten Taste suchen.

Ich weiß nicht, warum Sie N Tasten erstellen möchte, sieht es aus wie Ihr Wert von N größer als 10 ist zumindest, wenn Sie nicht versuchen, sie alle auf einmal zu zeigen (ich meine passen alle von ihnen in ein einziger Bildschirm, Scroll-no) Sie könnten versuchen, die unsichtbaren Schaltflächen zu recyceln, so wie wir für die Listenansicht tun eine Listenansicht Halter verwenden. Dies würde Ihren Speicherbedarf und Leistung zu steigern, reduzieren und die Tasten basierten entweder auf dem Text unterscheiden Sie sich auf sie oder einen Tag gesetzt, oder Sie können auch einen Hinweis auf diese kleine Anzahl von Tasten halten.

Ist bevorzugt nicht zu versauen mit dem ids, setTag und getTag Methoden für diesen Zweck konzipiert wurden, ist es die schnelle und saubere Art und Weise ein paar Taste Hörer auf einem dynamisches Layout

einstellen

Diese Antwort kann Ihnen helfen: 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");
}
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top