2012-09-24 17 views
5

ho aggiunto alcuni pulsanti con le seguenti righe:Come ottenere OnClick() dai pulsanti aggiunti programmaticamente?

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++; 
    } 

Ma come posso ottenere i) metodi di coloro (OnClick? Ho già implementato View.OnClickListener con questo metodo:

@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; 
    } 
} 

Ma questo non funziona, come faccio a ottenere l'Es?

+1

Fa 'id_button' sempre 0? Se no, perché stai controllando per 0 nell'istruzione 'case'? Considera di non usare le costanti magiche la prossima volta. –

+1

non devi chiamare setOnClickListener ad un certo punto? (anche, setId non fa nulla, penso) – njzk2

+0

la creazione dei pulsanti è in un ciclo for e ci sono creati più di un pulsante. –

risposta

7

b è la vista, se il metodo onClick è nella tua classe principale basta usare b.setOnClickListener(this); e lasciare la tua attività implementa onClickListener e ce l'hai. Oppure fai il solito modo di impostare gli ascoltatori del tour.

L'ID viene utilizzato per riferimento xml, l'oggetto viene creato e l'utente che utilizza questo ID per fare riferimento, nel caso in cui è stata creata la vista b con tutte le proprietà di un ToggleButton. È la vista

Invece se si utilizza v.getId() basta usare if(v == b)

+0

OK, ma io uso un ciclo for e creo altri pulsanti e non so come controllare i diversi ID nella mia istruzione switch/case ... switch (v.getId()) {case R.id.id_button: \t Log.d ("ONCLICK", "Button gedrückt");} non è possibile perché ho impostato l'ID con questa riga b.setId (id_button); –

+0

Aggiungi le viste a un ArrayList ... usa un gruppo di viste per passarle attraverso e controllare quale su di esso id. – FabianCook

+0

E in tal caso se id_button è un numero incrementale che rappresenta ciascun pulsante, perché non usare solo Log.d ("Button" + v.getId()) ;? – FabianCook

6

Basta usare b.setOnClickListener(this), dove this fa riferimento alla classe che implementa OnClickListener.

Edit:

È possibile utilizzare le risorse ID per identificare i pulsanti. Vedere here per ulteriori informazioni. È possibile assegnare quegli ID alle viste generate in modo programmatico e controllarli per l'istruzione switch/caso.

In alternativa, come detto @SmartLemon, si può solo controllare if (v == b), allora non c'è bisogno di perdere tempo con gli ID.

+0

ok questo funziona bene per un pulsante, ma creo più pulsanti in un ciclo for con ID diversi. Come posso rendermene conto? –

+0

Ah, buon punto. Vedi modifica. – Magicode

+0

OK, ma non so come controllarli nella mia istruzione switch/case ... 'switch (v.getId()) {case R.id.id_button: \t Log.d ("ONCLICK", "Button gedrückt");} 'non è possibile perché ho impostato l'ID con questa riga' b.setId (id_button); ' –

3

hai impostato id del button come id_button giusto?

aggiungere onCreate Metodo:

b1.setOnClickListener(this);  

utilizzare tale id nel metodo onClick come di seguito:

@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

Il file 'R' è un file generato, generato prima del runtime, hes che non usa R.id.id_button usando id_button. È solo una variabile locale. – FabianCook

+0

deve usare l'id. Sì, so che R è un file generato. Ma lui può usare R.id. non c'è alcun problema perché l'ID è memorizzato in R prima che l'utente faccia clic sul pulsante .... –

+0

Ma lui ha già la variabile locale ... sarebbe sciocco fare riferimento a un altro file per qualcosa già lì. Questo fa apparire il fatto successivo, perché usare v.getId e b.getId quando puoi semplicemente confrontare v con b? – FabianCook

3

Come si implementa l'onClickListener nella la classe di attività è possibile passare l'oggetto corrente utilizzando questa parola chiave per registrare il listener click per il componente.

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 qui quindi non funziona –

2

cambiamento come questo ..

@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

qui b dovrebbe essere dichiarato all'esterno di OnCreate() per ottenere l'accesso :) –