2012-11-21 14 views
21

Czy można utworzyć klasę dodatkową, aby pomieścić OnClick Listener? Znaczenie nie jest tworzone w klasie aktywności?Android - OnClick Listener w oddzielnej klasie

Po prostu uważam, że umieszczanie słuchaczy OnClick w głównej klasie aktywności jest po prostu chaotyczne i wolałbym, żeby były w oddzielnych klasach. Dzięki

+0

Zobacz http://stackoverflow.com/questions/13478526/android-button-navagation-with-onclick-listeners/13478749#13478749 – Ronnie

+0

Zrobiłem to już wcześniej, ale tego nie szukam. Dzięki i tak – Pztar

+0

@Pztar userSeven7s link powinien odpowiedzieć na twoje pytanie. W przeciwnym razie proszę wyjaśnij swoje pytanie. –

Odpowiedz

27

Oczywiście, to możliwe. Po prostu utwórz klasę, która implementuje View.OnClickListener i ustaw ją jako nasłuchującą na View. Na przykład:

public class ExternalOnClickListener implements View.OnClickListener { 

    public ExternalOnClickListener(...) { 
     // keep references for your onClick logic 
    } 

    @Override public void onClick(View v) { 
     // TODO: add code here 
    } 

} 

a następnie ustawić wystąpienie powyższej klasy jako słuchacza:

view.setOnClickListener(new ExternalOnClickListener(...)); 

parametryzowanej konstruktor nie jest obowiązkowe, ale jest to bardzo prawdopodobne, trzeba coś przekazać aż do rzeczywiście zrobić onClick(...) praca logiczna.

Wdrożenie anonimowej klasy jest na ogół łatwiejsze w obsłudze. Tylko myśl.

+0

Dzięki, to jest to, czego potrzebowałem. Zacząłem od tego, ale zupełnie zapomniałem o konstruktorze. – Pztar

+0

Świetna odpowiedź, dziękuję –

+0

Jeśli używasz klasy jako klasy wewnętrznej, powinieneś uczynić tę klasę ** statyczną ** – Tobrun

1

Możesz to zrobić. Ale pomyśl tylko, że nie będziesz mieć odniesienia do działania, ani jego atrybutów, w tym wszystkich widoków. (chyba że uczynisz je publicznym lub dostępnym za pomocą metod pobierających).

Zachowaj szczególną ostrożność, zachowując odwołania do działania lub dowolnych elementów w odbiorniku, ponieważ mogą one uniemożliwić odzyskiwanie pamięci odbiornika.

+0

Będziesz mieć odwołanie do kontekstu i klikniętego widoku ...(Metoda View obsługuje getContext()) – Tobrun

10

Zamiast umieszczać onCLicklistener w osobnej klasie, dlaczego nie próbujesz zdefiniować onClickListener poza onCreate()?

Na przykład: jak to

onCreate()

yourViewName.setOnClicklistener(listener): 

Poza onCreate()

private OnClickListener listener = new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 

     } 
    }; 
+7

Rozumiem, co próbujesz powiedzieć, wiem jak to zrobić. Ale tego nie szukam. Nie chcę tego w głównej działalności. Dzięki jednak – Pztar

+0

Bo jeśli to zrobisz bardzo MainActivity staje się bardzo długi i trudny do odczytania. Dzieląc go na inną klasę, długość MainActivity może być krótsza. – hexicle

5

Tak można. Jednak uczynienie słuchacza klasą wewnętrzną ma jedną zaletę - może uzyskać bezpośredni dostęp do pól i zmiennych twojej klasy aktywności. Jeśli się to odrębna klasa, a słuchacz rzeczywiście mieć dostęp do 5 widoków konstruktora słuchacz może wyglądać następująco:

MyListener listener = new MyListener(context, button, textView1, textView2, ratingBar, imageView);

Która jest trochę zbyt nieporęczne. Jeśli Twój słuchacz jest prosty, możesz go uczynić oddzielną klasą. W przeciwnym razie zależy to od Ciebie, abyś mógł je odczytać.

Powiązane problemy