2009-12-29 6 views
11

Większość próbek, które widzę, wydaje się używać anonimowej metody w wywołaniu takim jak button.setOnClickListener(). Zamiast tego chciałbym przekazać metodę zdefiniowaną w klasie Activity, w której pracuję. Jaki jest ekwiwalent Java/Android następującego okablowania obsługi zdarzeń w języku C#?Android - jak ustawić nazwaną metodę w button.setOnClickListener()

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

Gdzie:

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

Zasadniczo chciałbym ponownie użyć nieanonimowego metodę obsługi zdarzenia kliknięcia kilku przycisków.

Odpowiedz

14

Odpowiedź Roman Nurik jest prawie poprawna. View.OnClickListener() jest w rzeczywistości interfejsem. Jeśli więc Twoja aktywność implementuje OnClickListener, możesz ustawić ją jako obsługę przycisku kliknięcia.

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

Nie ma delegatów, jak w .Net, więc utknąłeś za pomocą funkcji opartej na interfejsie. W .Net można określić inną funkcję za pomocą delegatów.

+0

Nie zdawałem sobie sprawy, że Java nie ma typu delegata - dziękuję za wyczyszczenie tego! –

+1

Właśnie natknąłem się na ten artykuł (w rzeczywistości jest to stary artykuł). Nieco ciekawe komentarze na temat ich decyzji o nieużywaniu delegatów. Nie wiem, czy się zgadzam, bo uwielbiałem korzystać z delegatów w .Net. http://java.sun.com/docs/white/delegates.html – GrkEngineer

1

Podpis metody trzeba będzie to ...

public void onMyButtonClick(View view){ 

} 

Jeśli nie używasz dynamicznych klawiszy, można ustawić „Kliknięcie” zdarzenie z projektanta „onMyButtonClick”. Tak to robię dla statycznych przycisków na ekranie. Łatwiej mi było powiązać go z C#.

+0

Należy zauważyć, że jest to nowość w systemie Android 1.6, IIRC. – CommonsWare

8

Argument View.setOnClickListener musi być instancją klasy View.OnClickListener (wewnętrzna klasa klasie View) .. Dla Państwa przypadku użycia, można zachować instancję tej klasy wewnętrznej w zmiennej, a następnie przekazać, że w, tak:

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

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

Jeśli potrzebujesz słuchacza w wielu podprogramy/metod, można przechowywać go jako zmienną zarejestrował w swojej klasie aktywności.