2009-12-29 8 views
11

La maggior parte degli esempi che vedo sembrano utilizzare un metodo anonimo in una chiamata come button.setOnClickListener(). Invece, mi piacerebbe passare un metodo definito nella classe Activity in cui lavoro. Qual è l'equivalente Java/Android del seguente cablaggio del gestore eventi in C#?Android - Come impostare un metodo denominato in button.setOnClickListener()

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

Dove:

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

In sostanza, mi piacerebbe riutilizzare un metodo non anonima per gestire l'evento clic di più pulsanti.

risposta

14

La risposta di Roman Nurik è quasi corretta. View.OnClickListener() è in realtà un'interfaccia. Pertanto, se la tua attività implementa OnClickListener, puoi impostarla come gestore di clic del pulsante.

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. 
     } 
} 

Non ci sono delegati come in .Net, quindi sei bloccato usando la funzione basata sull'interfaccia. In .Net è possibile specificare una funzione diversa attraverso l'uso dei delegati.

+0

Non mi ero reso conto che Java non aveva un tipo delegato - grazie per averlo chiarito! –

+1

In realtà ho appena trovato questo articolo (in realtà è un vecchio articolo). Commenti un po 'interessanti sulla loro decisione di non usare i delegati. Non so se sono d'accordo perché mi è piaciuto usare i delegati in .Net. http://java.sun.com/docs/white/delegates.html – GrkEngineer

1

La firma del metodo dovrà essere questo ...

public void onMyButtonClick(View view){ 

} 

Se non si utilizza pulsanti dinamici, è possibile impostare l'evento "onClick" dal progettista "onMyButtonClick". Ecco come lo faccio per i pulsanti statici su uno schermo. È stato più facile per me collegarlo a C#.

+0

Si noti che questo è nuovo per Android 1.6, IIRC. – CommonsWare

8

L'argomento di View.setOnClickListener deve essere un'istanza della classe View.OnClickListener (una classe interna della classe View) .. Per il vostro caso d'uso, è possibile mantenere un'istanza di questa classe interna in una variabile e quindi passare che, in questo modo:

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

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

Se avete bisogno di questo ascoltatore su più subroutine/metodi, è possibile memorizzare come variabile membro nella classe di attività.

Problemi correlati