2012-01-23 13 views
57

Powiel możliwe:
Difference between OnClick() event and OnClickListener?Kliknij przycisk słuchaczy w Androidzie

Jestem pół-nowym do rozwoju Android i kiedy po raz pierwszy zaczął starałem się unikać układ xml przez dowolny to konieczne, więc niektóre z moich wcześniejszych projektów zawierają przyciski, które jawnie tworzą OnClickListener i implementują je jako anonimową klasę wewnętrzną. Takich jak -

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

Ale jak mam bardziej zaznajomieni z Androidem, zacząłem rozumieć wartość układów xml i wdrożone przyciski jak ten

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

w pliku XML układu, gdzie ZrobTo została zdefiniowana w java.

Moje pytanie brzmi, czy te 2 metody funkcjonalnie to samo? Czy gdzieś za kulisami zdefiniowany jest OnClickListener przez kompilator? Czy są jakieś funkcje, które można wykupić za pomocą jednego lub drugiego sposobu?

+1

[Oto przydatny dyskusja ] (http://stackoverflow.com/a/7453469/1154026) Myślę, że pomoże ci w twoich pytaniach. – VicVu

+0

Możesz ustawić odbiornik kliknięć na trzy sposoby, 1. Ustawiając osobny detektor kliknięcia dla każdego elementu. 2. Wdrażanie OnClickListener w działaniu. 3. tworzenie oddzielnej funkcji obsługi kliknięcia przycisku i dodanie tej funkcji w xml. możesz znaleźć ten przykład tutaj http://wiki.workassis.com/android-threeways-to-set-click-listener/ –

Odpowiedz

139

To są dokładnie to samo. został dodany na poziomie interfejsu API 4, aby było łatwiejsze, bardziej podobne do JavaScript-a i napędzać wszystko z pliku XML. To, co robi wewnętrznie, to dodanie przycisku OnClickListener, który wywołuje metodę DoIt.

Oto co użyciem android:onClick="DoIt" robi wewnętrznie:

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

Jedyną rzeczą, którą kompromis za pomocą , jak zwykle z konfiguracji XML, jest to, że staje się nieco trudniejsze, aby dodać zawartość dynamiczną (programowo , możesz zdecydować się na dodanie jednego słuchacza lub innego w zależności od twoich zmiennych). Ale można to łatwo pokonać, dodając test w ramach metody DoIt.

+0

Doskonała odpowiedź. Dziękujemy za wyjaśnienie, co Android robi za kulisami podczas ustawiania połączenia zwrotnego za pośrednictwem XML. –

+5

Warto zauważyć, że 'android: onClick' nie zadziała z metodą zdefiniowaną w fragmencie. Najlepszym rozwiązaniem jest po prostu dołączenie słuchaczy do fragmentu. Aby uzyskać więcej informacji: http://stackoverflow.com/questions/6091194/how-to-handle-button-clicks-using-the-xml-onclick-winin-fragments – adamdport

+0

Dzięki za krótkie wyjaśnienie. – JoeYo

0

Nawet jeśli zdefiniowałeś android: onClick = "DoIt" w XML, musisz upewnić się, że twoja aktywność (lub kontekst widoku) ma publiczną metodę zdefiniowaną z dokładnie tą samą nazwą i Wyświetl jako parametr. Android przesyła twoje definicje za pomocą tej implementacji w działaniu. Na końcu implementacja będzie miała ten sam kod, który napisałeś w anonimowej klasie wewnętrznej. Tak więc, w prostych słowach zamiast posiadania wewnętrznej klasy i powiązania słuchacza w działaniu, po prostu będziesz miał publiczną metodę z kodem implementacyjnym.

+1

Mam to zaimplementowane w moim java, po prostu nie opublikowałem go, ponieważ metoda nie była odpowiednia dla pytania. – SmashCode

2

przy użyciu języka XML, musisz sam ustawić odbiornik onclick. Najpierw klasa implements OnClickListener następnie dodać zmienna Button button1; następnie dodać do swojej onCreate()

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

podczas wdrożenia OnClickListener trzeba dodać odziedziczoną metodę onClick() gdzie można obsługiwać kliknięcia

Powiązane problemy