Zdaję sobie sprawę, że podobnie sformułowane pytanie zadawano już wcześniej, ale jest inaczej. Jestem całkiem nowy w tworzeniu aplikacji na Androida i mam trzy pytania dotyczące różnic między android:onclick=""
atrybutem XML a setOnClickListener
metodą.
Jakie są różnice między nimi? Czy jest różnica między dwiema implementacjami znalezionymi w czasie kompilacji lub w czasie wykonywania, czy też obydwoma?
Jakie przypadki użycia są korzystne dla której implementacji?
Jakie różnice powoduje użycie fragmentów w systemie Android przy wyborze implementacji?
android
xml
performance
android-fragments
KG6ZVP
źródło
źródło
onclick
ponieważ należy upewnić się, że każda klasa implementuje tę metodę. Zakłada się, że używasz układu więcej niż raz. Jeśli jednak miałbyś mieć interfejs Java, aby upewnić się, że metoda jest we wszystkich klasach, które ją zaimplementowały, nie musiałbyś się martwić.android:onclick
kiedy jest to wygodne, ale wiem, że czasami powodowało to problemy, których też nie pamiętam :)Odpowiedzi:
Różnica między OnClickListener a OnClick:
Obie działają w ten sam sposób, tylko jeden jest ustawiany za pomocą kodu java, a drugi przez kod xml.
Implementacja kodu setOnClickListener:
Button btn = (Button) findViewById(R.id.mybutton); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { myFancyMethod(v); } }); // some more code public void myFancyMethod(View v) { // does something very interesting }
Implementacja XML:
<?xml version="1.0" encoding="utf-8"?> <!-- layout elements --> <Button android:id="@+id/mybutton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Click me!" android:onClick="myFancyMethod" /> <!-- even more layout elements -->
Występ:
Oba są takie same pod względem wydajności. XML jest wstępnie analizowany do kodu binarnego podczas kompilacji. więc nie ma nad głową w Xml.
Ograniczenie:
android: onClick jest przeznaczony dla interfejsu API na poziomie 4, więc jeśli celujesz w <1,6, nie możesz go używać.
źródło
Jestem zszokowany, że nikt o tym nie mówił, ale bądź ostrożny, chociaż
android:onClick
XML wydaje się być wygodnym sposobem obsługi kliknięć,setOnClickListener
implementacja robi coś więcej niż dodanieonClickListener
. Rzeczywiście, ustawia właściwość viewclickable
na true.Chociaż może to nie stanowić problemu w większości implementacji Androida, według konstruktora telefonu, domyślnie przycisk button ma zawsze wartość clickable = true, ale inne konstruktory w niektórych modelach telefonu mogą mieć domyślną wartość clickable = false w widokach innych niż Button.
Więc ustawienie XML nie wystarczy, musisz cały czas myśleć, aby dodać
android:clickable="true"
brak przycisku, a jeśli masz urządzenie, w którym wartość domyślna jest klikalna = prawda i zapomnisz choć raz umieścić ten atrybut XML, nie zauważysz problem w czasie wykonywania, ale dostaniesz informację zwrotną na rynku, kiedy trafi on w ręce Twoich klientów!Ponadto nigdy nie możemy być pewni, w jaki sposób program Proguard zaciemni i zmieni nazwy atrybutów XML i metody klas, więc nie jest w 100% bezpieczny, że pewnego dnia nigdy nie będzie miał błędu.
Jeśli więc nigdy nie chcesz mieć kłopotów i nigdy o tym nie myśl, lepiej skorzystać z
setOnClickListener
bibliotek lub takich jak ButterKnife z adnotacją@OnClick(R.id.button)
źródło
android:onClick
?Po prostu:
Jeśli masz
android:onClick = "someMethod"
w XML , szukapublic void someMethod
w klasie Activity.OnClickListener
jest wywoływana bezpośrednio z Twojej Aktywności i jest powiązana z jakimś konkretnymView
. Na przykładsomeButton.setOnClickListener
w poniższym kodzie jest powiedziane, co należy zrobić posomeButton
naciśnięciu.Mam nadzieję, że to pomoże :)
źródło
Jak powiedziałem wcześniej: oba są sposobem na dodanie logiki w odpowiedzi na zdarzenie, w tym przypadku zdarzenie typu „kliknięcie”.
Wybrałbym oddzielenie logiki od prezentacji, tak jak robimy to w świecie HTML / JavaScript: zostaw XML do prezentacji i dodaj detektory zdarzeń za pomocą kodu.
źródło
Jeśli masz kilka przycisków wykorzystujących tylko jedną metodę, sugeruję zrobienie tego w java. Ale jeśli masz przycisk z jedną określoną metodą, onClick w XML byłby lepszy.
źródło
Wygodniej jest zawsze używać atrybutu android: onClick, chyba że masz dobry powód, aby tego nie robić, na przykład, jeśli tworzysz wystąpienie Button w czasie wykonywania lub musisz zadeklarować zachowanie kliknięcia w podklasie Fragment.
źródło
Istnieje kilka powodów, dla których warto programowo ustawić plik
OnClickListener
. Po pierwsze, jeśli kiedykolwiek zechcesz zmienić zachowanie przycisku, gdy aplikacja jest uruchomiona. Możesz skierować swój przycisk całkowicie na inną metodę lub po prostu wyłączyć przycisk, ustawiając opcję,OnClickListener
która nic nie robi.Kiedy definiujesz detektor za pomocą
onClick
atrybutu, widok szuka metody o tej nazwie tylko w swoim działaniu hosta. Programowe ustawienieOnClickListener
pozwala kontrolować zachowanie przycisku z innego miejsca niż aktywność hosta. Stanie się to bardzo istotne, gdy użyjemyFragments
, które są w zasadzie mini działaniami, pozwalającymi na tworzenie kolekcji widoków wielokrotnego użytku z własnym cyklem życia, które można następnie połączyć w działania. Fragmentów zawsze trzeba używaćOnClickListeners
do kontrolowania swoich przycisków, ponieważ nie są one działaniami i nie będą wyszukiwane w poszukiwaniu detektorów zdefiniowanych w onClick.źródło
Myślę, że główna różnica między nimi to:
OnClick: Po kliknięciu przycisku palcem.
OnClickListner: To może być szerszy wybór, który można zaimplementować w różnych kodach.
Na przykład, kiedy wpiszesz adres url „ymail.com”, yahoo znajdzie twoją nazwę użytkownika i hasło z przeglądarki i włączy przycisk stanu kliknięcia, aby otworzyć twoją pocztę. Ta akcja powinna być realizowana tylko w onClickListener.
To jest mój pomysł!
źródło