2012-09-24 24 views
5

Ich habe einige Tasten mit den folgenden Zeilen hinzugefügt:Wie bekomme ich OnClick() von programmatisch hinzugefügten Schaltflächen?

for (int i=0; i<XML.size(); i++) { 
//add button 
ToggleButton b = new ToggleButton(this); 
// Setting the parameters 
lefttextv.setLayoutParams(lleft); 
b.setLayoutParams(bright); 
//customize button 
    b.setOnClickListener(this); 
b.setId(id_button); 
System.out.println(id_button); 
b.setHeight(100); 
b.setWidth(200); 
// Adding to the RelativeLayout as a child 
layouth.addView(lefttextv); 
layouth.addView(b); 
    id_button++; 
    } 

Aber wie kann ich die OnClick() Methoden für diejenigen bekommen? Ich implementierte bereits View.OnClickListener mit dieser Methode:

@Override 
public void onClick(View v) { 
    // TODO Auto-generated method stub 
    switch (v.getId()) 
    { 
    case id_button: Log.d("Button 0","Button 0 pressed); 
     break; 
    } 
} 

Aber das funktioniert nicht, wie bekomme ich die Id?

+1

Ist 'id_button' immer 0? Wenn nicht, warum suchen Sie in der 'case'-Anweisung nach 0? Überlege, beim nächsten Mal keine magischen Konstanten zu verwenden. –

+1

musst du setOnClickListener nicht irgendwann aufrufen? (auch setId tut nichts, denke ich) – njzk2

+0

Die Erstellung der Schaltflächen erfolgt in einer For-Schleife und es werden mehr als eine Schaltfläche erstellt. –

Antwort

7

b ist die Ansicht, wenn Ihre onClick Methode in der Hauptklasse ist nur b.setOnClickListener(this); verwenden und lassen Ihre Aktivität implementieren onClickListener und dort haben Sie es. Oder machen Sie die übliche Weise, wie Sie Tour-Hörer einstellen.

Die ID wird für XML-Referenz verwendet, das Objekt wird erstellt und Sie verwenden diese ID zum Referenzieren. In diesem Fall haben Sie die Ansicht b mit allen Eigenschaften eines ToggleButton erstellt. Es ist die Aussicht.

Statt bei Verwendung von v.getId() nur if(v == b)

+0

OK, aber ich benutze eine for-Schleife und erstellen Sie mehr Schaltflächen und ich kann nicht für die verschiedenen IDs in meiner switch/case-Anweisung überprüfen ... switch (v.getId()) {case R.id.id_button: \t Log.d ("ONCLICK", "Button gedrückt");} ist nicht möglich, da ich die ID mit dieser Zeile gesetzt habe b.setId (id_button); –

+0

Fügen Sie die Ansichten zu einer ArrayList hinzu ... Verwenden Sie eine Ansichtsgruppe, um durch sie zu gehen, und überprüfen Sie, welche ID darauf steht. – FabianCook

+0

Und in diesem Fall, wenn id_button eine inkrementierende Zahl ist, die jede Schaltfläche darstellt, warum nicht einfach Log.d verwenden ("Button" + v.getId()) ;? – FabianCook

6

Verwenden Sie einfach b.setOnClickListener(this), wobei sich this auf die Klasse bezieht, die OnClickListener implementiert.

Edit:

Sie können ID-Ressourcen verwenden, um Ihre Tasten zu identifizieren. Weitere Informationen finden Sie unter here. Sie können diese IDs Ihren programmatisch erzeugten Sichten zuordnen und in Ihrer switch/case-Anweisung nach diesen suchen.

Alternativ wie @SmartLemon sagte, können Sie einfach überprüfen, if (v == b), dann müssen Sie nicht mit IDs kümmern.

+0

ok das funktioniert gut für eine Schaltfläche, aber ich erstelle mehr Schaltflächen in einer for-Schleife mit verschiedenen IDs. Wie kann ich das erkennen? –

+0

Ah, guter Punkt. Siehe Bearbeiten. – Magicode

+0

OK, aber ich weiß nicht, wie man in meiner switch/case-Anweisung nach ihnen sucht ... 'switch (v.getId()) {case R.id.id_button: \t Log.d ("ONCLICK", "Button gedrückt");} ist nicht möglich, da ich die ID mit dieser Zeile gesetzt habe "b.setId (id_button);" –

3

haben Sie id der button als id_button richtig eingestellt?

hinzufügen onCreate Methode:

b1.setOnClickListener(this);  

Verwenden Sie diese ID in onClick Methode wie folgt:

@Override 
public void onClick(View v) { 
    // TODO Auto-generated method stub 
    if(v.getId() == R.id.id_button) 
    { 
    Log.d("Button 0","Button 0 pressed); 
     break; 
    } 
} 
+0

Die 'R'-Datei ist eine generierte Datei, die vor der Laufzeit generiert wurde. Sie verwendet keine R.id.button -He mit id_button. Es ist nur eine lokale Variable. – FabianCook

+0

er muss die ID verwenden. Ja, ich weiß, R ist eine generierte Datei. Aber er kann R.id benutzen. Es gibt kein Problem, weil die ID in R gespeichert wird, bevor der Benutzer auf die Schaltfläche .... –

+0

klickt. Aber er hat die lokale Variable bereits ... wäre albern, eine andere Datei für etwas zu referenzieren, das bereits dort ist. Das bringt dann die nächste Tatsache, warum v.getId und b.getId verwenden, wenn Sie einfach v mit b vergleichen können? – FabianCook

3

verwenden, wie Sie die OnClickListener in Ihrer Aktivitätsklasse implementieren können Sie das aktuelle Objekt mit diesem Schlüsselwort übergeben Sie den Klick-Listener für die Komponente zu registrieren.

class MyActivity extends Activity implements OnClickListener{ 
    private static final int id_button = 0; 

    public void onCreate(Bundle b){ 
     //add button 
     ToggleButton b = new ToggleButton(this); 
     // Setting the parameters 
     lefttextv.setLayoutParams(lleft); 
     b.setLayoutParams(bright); 
     //customize button 
     b.setId(id_button); 
     System.out.println(id_button); 
     b.setHeight(100); 
     b.setWidth(200); 
     // Adding to the RelativeLayout as a child 
     layouth.addView(lefttextv); 
     layouth.addView(b); 
     b.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 
     switch (v.getId()){ 
     case 0: Log.d("Button 0","Button 0 pressed); 
      break; 
     } 
    } 
} 
+0

v.getId()! = 0 hier also funktioniert es nicht –

2

Änderung wie folgt ..

@Override 
public void onClick(View v) { 
    // TODO Auto-generated method stub 
    int i= b.getId(); 
    switch (v.getId()) 
    { 
     case i: 
      Log.d("Button 0","Button 0 pressed"); 
      break; 
    } 
} 
+0

Hier sollte b außerhalb von OnCreate() erklärt werden, um den Zugriff zu bekommen :) –

Verwandte Themen