Mam aktywność:
public class Mtest extends Activity {
Button b1;
Button b2;
public void onCreate(Bundle savedInstanceState) {
...
b1 = (Button) findViewById(R.id.b1);
b2 = (Button) findViewById(R.id.b2);
b1.setOnClickListener(myhandler);
b2.setOnClickListener(myhandler);
...
}
View.OnClickListener myhandler = new View.OnClickListener() {
public void onClick(View v) {
// MY QUESTION STARTS HERE!!!
// IF b1 do this
// IF b2 do this
// MY QUESTION ENDS HERE!!!
}
}
}
Jak sprawdzić, który przycisk został kliknięty?
Odpowiedzi:
Dowiesz się, jak to zrobić, w prosty sposób:
Jeśli pracujesz tylko z jednym nasłuchiwaniem kliknięć, możesz:
Chociaż nie polecam tego w ten sposób, ponieważ będziesz musiał dodać znak
if
dla każdego używanego przycisku. Trudno to utrzymać.źródło
View
nie jestButton
, aleButton
jestView
. Chociaż możesz rzucić aView
doButton
. Pamiętaj, że drugi sposób zrobienia tego nie jest zalecany ... może to v może nie być Button, który wygeneruje wyjątek rzutowania.Możesz też spróbować tego samego, ale bez słuchaczy. W definicji XML przycisku:
A w swoim kodzie zdefiniuj metodę
ButtonOnClick
:źródło
if
instrukcji i słuchaczy. Słuchacze są świetne, jeśli przyciski są tworzone w czasie wykonywania, ale często tak nie jest.Fragment
s, ponieważ wywołanie zwrotne musi znajdować się w działaniu (nie we fragmencie).Wolę:
I wtedy:
Switch
-case
jest łatwiejszy w utrzymaniu niżif
-else
, a ta implementacja nie wymaga tworzenia wielu zmiennych klasowych.źródło
Five Ways to Wire Up an Event Listener to świetny artykuł omawiający różne sposoby konfigurowania pojedynczego nasłuchiwania zdarzeń. Pozwólcie, że rozwinę to tutaj dla wielu słuchaczy.
1. Klasa członkowska
2. Typ interfejsu
3. Anonimowa klasa wewnętrzna
4. Wdrożenie w działaniu
5. Atrybut w układzie widoku dla zdarzeń OnClick
A w xml:
źródło
Jeśli nie chcesz zapisywać instancji przycisku 2 w kodzie klasy, postępuj w ten LEPSZY sposób (jest to bardziej przejrzyste i szybkie !!):
źródło
Innym sposobem na zrobienie tego jest pojedynczy słuchacz z działania, na przykład:
Lubię to robić z pojedynczym IF zamiast przełącznikiem-else, ale jeśli wolisz, powinieneś zrobić:
źródło
Najlepszym sposobem jest
switch
ominięcie między v.getId (). Posiadanie oddzielnego anonimowego OnClickListener dla każdego przycisku zajmuje więcej pamięci. Przesyłanie widoku do przycisku jest niepotrzebne. Używanie if-else, gdy przełącznik jest możliwy, jest wolniejsze i trudniejsze do odczytania. W źródle Androida często można zauważyć porównanie odniesień według warunku if-else:Nie wiem dokładnie, dlaczego wybrali ten sposób, ale to też działa.
źródło
użyj setTag ();
lubię to:
źródło
Oprócz odpowiedzi Cristiana C (przepraszam, nie mam możliwości komentowania), jeśli utworzysz jedną obsługę dla obu przycisków, możesz bezpośrednio porównać v do b1 i b2, lub jeśli chcesz porównać według identyfikatora, nie trzeba rzutować v na Button (View ma również metodę getId ()), dzięki czemu nie ma obaw o wyjątek rzutowania.
źródło
źródło
Więcej informacji znajdziesz w tym artykule
źródło