2009-12-29 8 views
11

La mayoría de las muestras que veo parecen usar un método anónimo en una llamada como button.setOnClickListener(). En cambio, me gustaría pasar un método definido en la clase de Actividad en la que estoy trabajando. ¿Cuál es el equivalente de Java/Android del siguiente cableado de controlador de eventos en C#?Android - Cómo establecer un método con nombre en button.setOnClickListener()

Button myButton = new Button(); 
myButton.Click += this.OnMyButtonClick; 

Dónde:

private void OnMyButtonClick(object sender, EventArgs ea) 
{ 
} 

Esencialmente, me gustaría volver a utilizar un método no anónimo para controlar el evento clic de varios botones.

Respuesta

14

La respuesta de Roman Nurik es casi correcta. View.OnClickListener() es en realidad una interfaz. Entonces, si su Actividad implementa OnClickListener, puede configurarlo como el controlador de clic de botón.

public class Main extends Activity implements OnClickListener { 

     public void onCreate() { 
      button.setOnClickListener(this); 
      button2.setOnClickListener(this); 
     } 

     public void onClick(View v) { 
      //Handle based on which view was clicked. 
     } 
} 

No hay delegados como en .Net, por lo que está atascado utilizando la función basada en la interfaz. En .Net puede especificar una función diferente mediante el uso de delegados.

+0

No me di cuenta de que Java no tenía un tipo de delegado, ¡gracias por aclararlo! –

+1

De hecho acabo de encontrar este artículo (en realidad es un artículo antiguo). Comentarios algo interesantes sobre su decisión de no usar delegados. No sé si estoy de acuerdo porque me encantó usar delegados en .Net. http://java.sun.com/docs/white/delegates.html – GrkEngineer

1

La firma del método tendrá que ser esto ...

public void onMyButtonClick(View view){ 

} 

Si no está utilizando botones dinámicos, se puede establecer el evento "onclick" de que el diseñador "onMyButtonClick". Así es como lo hago para los botones estáticos en una pantalla. Fue más fácil para mí relacionarlo con C#.

+0

Tenga en cuenta que esto es nuevo en Android 1.6, IIRC. – CommonsWare

8

El argumento para View.setOnClickListener debe ser una instancia de la clase View.OnClickListener (una clase interna de la clase View) .. Para su caso de uso, se puede mantener una instancia de esta clase interna en una variable y luego pasar que en, de este modo:

View.OnClickListener clickListener = new OnClickListener() { 
    public void onClick(View v) { 
     // do something here 
    } 
}; 

myButton.setOnClickListener(clickListener); 
myButton2.setOnClickListener(clickListener); 

Si necesita este oyente a través de múltiples subrutinas/métodos, se puede almacenar como una variable miembro de la clase de actividad.

Cuestiones relacionadas