2012-01-23 19 views
57

Duplicar posibles:
Difference between OnClick() event and OnClickListener?clic de botón oyentes en Android

estoy semi-nuevo en el desarrollo de Android y cuando empecé Traté de evitar el uso del diseño xml por cualquier significa necesario para que algunos de mis proyectos anteriores incluyan botones que creen explícitamente un OnClickListener y lo implementen como una clase interna anónima. Tales como -

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

Pero a medida que fui más familiarizados con androide, empecé a comprender el valor de los diseños de XML y los botones implementados como esto

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

en el XML de diseño, donde se definió DoIt en java

Mi pregunta es, ¿estos 2 métodos son funcionalmente la misma cosa? ¿Hay un OnClickListener definido por el compilador en algún lugar detrás de las escenas? ¿Hay alguna característica que intercambies usando de una manera u otra?

+1

[Aquí hay una discusión útil ] (http://stackoverflow.com/a/7453469/1154026) Creo que te ayudará con tu pregunta. – VicVu

+0

Puede configurar el oyente de clic de tres maneras, 1. configurando oyente de clic individual para cada elemento. 2. Implementación de OnClickListener en la actividad. 3. crear una función separada para manejar el clic del botón y agregar esta función en xml. Puede encontrar estos ejemplos aquí http://wiki.workassis.com/android-three-ways-to-set-click-listener/ –

Respuesta

139

Estos son exactamente lo mismo. se agregó en API nivel 4 para que sea más fácil, más similar a Javascript-web, y maneje todo desde el XML. Lo que hace internamente es agregar un OnClickListener en el botón, que llama a su método DoIt.

Esto es lo que el uso de un android:onClick="DoIt" hace internamente:

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

La única cosa que el comercio fuera mediante el uso de , como de costumbre con la configuración de XML, es que se hace un poco más difícil agregar contenido dinámico (mediante programación , puede decidir agregar un oyente u otro dependiendo de sus variables). Pero esto se derrota fácilmente agregando su prueba dentro del método DoIt.

+0

Excelente respuesta. Gracias por explicar qué hace Android tras bastidores cuando configura la devolución de llamada a través de XML. –

+5

Vale la pena señalar que 'android: onClick' no funcionará con un método definido en un fragmento. La mejor solución es adjuntar a los oyentes dentro del fragmento. Para obtener más información: http://stackoverflow.com/questions/6091194/how-to-handle-button-clicks-using-the-xml-onclick-within-fragments – adamdport

+0

Gracias por la breve explicación. – JoeYo

0

Aunque defina android: onClick = "DoIt" en XML, debe asegurarse de que su actividad (o contexto de visualización) tenga un método público definido con el mismo nombre exacto y Vista como parámetro. Android conecta sus definiciones con esta implementación en actividad. Al final, la implementación tendrá el mismo código que usted escribió en la clase interna anónima. Por lo tanto, en palabras simples en lugar de tener clase interna y attachement de oyente en actividad, simplemente tendrá un método público con código de implementación.

+1

Lo tengo implementado en mi Java, simplemente no lo publiqué porque el método no era relevante para la pregunta. – SmashCode

2

utilizando XML, debe configurar el oyente onclick usted mismo. En primer lugar tener su clase implements OnClickListener continuación, agregue la variable Button button1; continuación, agregue esto a su onCreate()

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

al implementar OnClickListener es necesario agregar el método heredado onClick() donde va a manejar los clics

Cuestiones relacionadas