2012-01-23 13 views
57

Eventuali duplicati:
Difference between OnClick() event and OnClickListener?pulsante CLICK ascoltatori in Android

Sono semi-nuovo per lo sviluppo Android e quando ho iniziato ho cercato di evitare di utilizzare il layout xml da qualsiasi significa necessario quindi alcuni dei miei progetti precedenti coinvolgono pulsanti che creano esplicitamente un OnClickListener e lo implementano come classe interna anonima. Come ad esempio -

final Button button = new Button(this); 
button.setText("Click to change second line of text"); 

OnClickListener buttonListener = new View.OnClickListener() { 
    boolean clicked = false; 
    int numClicks = 0; 

    @Override 
    public void onClick(View v) { 
     if(numClicks > 5) { 
      button.setText("STOP IT"); 
     } 
     numClicks++; 
     if(clicked == false){ 
      clicked = true; 
      tv2.setText("Text Changed on Button Click");  
     } 
     else 
     { 
      clicked = false; 
      tv2.setText("Click again"); 
     }  
    } 
}; 
button.setOnClickListener(buttonListener); 

Ma, come ho avuto più familiarità con Android, ho cominciato a capire il valore dei layout XML e bottoni realizzati in questo modo

<Button 
    android:id="@+id/button1" 
    android:layout_height = "wrap_content" 
    android:layout_width ="wrap_content" 
    android:text = "lets do this" 
    android:onClick = "DoIt" 
    /> 

nel XML di layout, in cui è stato definito DoIt nella java.

La mia domanda è, sono questi 2 metodi funzionalmente la stessa cosa? C'è un OnClickListener definito dal compilatore da qualche parte dietro le quinte? Ci sono delle funzionalità che ti consentono di utilizzare in un modo o nell'altro?

+1

[Qui è una discussione utile ] (http://stackoverflow.com/a/7453469/1154026) Penso che aiuterà con la tua domanda. – VicVu

+0

È possibile impostare il listener dei clic in tre modi: 1. impostazione del listener di clic individuale per ciascun elemento. 2. implementazione di OnClickListener nell'attività. 3. creando una funzione separata per gestire il clic del pulsante e aggiungere questa funzione in xml. puoi trovare questi esempi qui http://wiki.workassis.com/android-three-ways-to-set-click-listener/ –

risposta

139

Questi sono esattamente gli stessi. è stato aggiunto nel livello 4 dell'API per renderlo più semplice, più simile a JavaScript-web e per guidare tutto dall'XML. Quello che fa internamente è aggiungere un OnClickListener sul pulsante, che chiama il tuo metodo DoIt.

Ecco cosa utilizzando un android:onClick="DoIt" fa internamente:

Button button= (Button) findViewById(R.id.buttonId); 
button.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     DoIt(v); 
    } 
}); 

L'unica cosa è il commercio off utilizzando , come al solito con configurazione XML, è che diventa un po 'più difficile aggiungere contenuti dinamici (programatically , potresti decidere di aggiungere un ascoltatore o un altro a seconda delle tue variabili). Ma questo è facilmente sconfitto aggiungendo il test nel metodo DoIt.

+0

Ottima risposta. Grazie per aver spiegato cosa fa Android dietro le quinte quando imposti la richiamata tramite XML. –

+5

Vale la pena notare che 'android: onClick' non funziona con un metodo definito in un frammento. La soluzione migliore è semplicemente quella di collegare gli ascoltatori all'interno del frammento. Per maggiori informazioni: http://stackoverflow.com/questions/6091194/how-to-handle-button-clicks-using-the-xml-onclick-within-fragments – adamdport

+0

Grazie per la breve spiegazione. – JoeYo

0

Anche se si definisce Android: onClick = "DoIt" in XML, è necessario assicurarsi che l'attività (o il contesto di visualizzazione) disponga di un metodo pubblico definito con lo stesso nome e Visualizza come parametro. Android collega le tue definizioni con questa implementazione in attività. Alla fine, l'implementazione avrà lo stesso codice che hai scritto nella classe interna anonima. Quindi, in parole semplici invece di avere un interlocutore interno di classe e ascoltatore nell'attività, avrai semplicemente un metodo pubblico con codice di implementazione.

+1

L'ho implementato nel mio java, ma non l'ho postato perché il metodo non era pertinente alla domanda. – SmashCode

2

utilizzando XML, è necessario impostare il listener onclick. In primo luogo hanno la classe implements OnClickListener quindi aggiungere la variabile Button button1; quindi aggiungere questo al vostro onCreate()

button1 = (Button) findViewById(R.id.button1); 
button1.setOnClickListener(this); 

quando si implementa OnClickListener è necessario aggiungere il metodo ereditato onClick() dove potrete gestire i vostri scatti

Problemi correlati