Pre-Honeycomb (Android 3), każde działanie zostało zarejestrowane do obsługi kliknięć przycisków za pomocą onClick
znacznika w pliku XML układu:
android:onClick="myClickMethod"
W ramach tej metody można użyć view.getId()
instrukcji switch do wykonania logiki przycisku.
Wraz z wprowadzeniem plastra miodu dzielę te działania na fragmenty, które można ponownie wykorzystać w wielu różnych działaniach. Większość zachowań przycisków jest niezależna od działania i chciałbym, aby kod znajdował się w pliku Fragments bez używania starej (wcześniejszej niż 1.6) metody rejestracji OnClickListener
dla każdego przycisku.
final Button button = (Button) findViewById(R.id.button_id);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// Perform action on click
}
});
Problem polega na tym, że kiedy mój układ jest zawyżony, to nadal działanie hostingu otrzymuje kliknięcia przycisku, a nie poszczególne fragmenty. Czy istnieje dobre podejście do któregoś z nich
- Zarejestruj fragment, aby otrzymywać kliknięcia przycisku?
- Czy przekazać zdarzenia kliknięcia z działania do fragmentu, do którego należą?
źródło
setOnClickListener
ifindViewById
dla każdego przycisku, dlategoonClick
został dodany, aby uprościć sprawę.Odpowiedzi:
Możesz po prostu to zrobić:
Czynność:
Fragment:
W odpowiedzi na @Ameen, która chciała mniej sprzężenia, więc Fragmenty mogą być ponownie użyte
Berło:
Czynność:
Fragment:
źródło
Wolę używać następującego rozwiązania do obsługi zdarzeń onClick. Działa to również w przypadku działania i fragmentów.
źródło
Myślę, że problem polega na tym, że widok wciąż jest działalnością, a nie fragmentem. Fragmenty nie mają własnego niezależnego widoku i są dołączone do widoku działań nadrzędnych. Właśnie dlatego wydarzenie kończy się Aktywnością, a nie fragmentem. To niefortunne, ale myślę, że będziesz potrzebować trochę kodu, aby to zadziałało.
To, co robiłem podczas konwersji, to po prostu dodanie detektora kliknięć, który wywołuje starą procedurę obsługi zdarzeń.
na przykład:
źródło
Niedawno rozwiązałem ten problem bez konieczności dodawania metody do działania kontekstu lub konieczności implementowania OnClickListener. Nie jestem pewien, czy jest to „prawidłowe” rozwiązanie, ale działa.
Na podstawie: https://developer.android.com/tools/data-binding/guide.html#binding_events
Można to zrobić za pomocą powiązań danych: wystarczy dodać instancję fragmentu jako zmienną, a następnie można połączyć dowolną metodę za pomocą onClick.
Fragment kodu łączącego byłby ...
źródło
android:name="fragment" android:type="com.example.testapp.fragments.CustomFragment"/>
name
atype
atrybuty ivariable
tagu nie powinny miećandroid:
prefiksu. Być może istnieje stara wersja układów Androida, która tego wymaga?ButterKnife jest prawdopodobnie najlepszym rozwiązaniem problemu bałaganu. Wykorzystuje procesory adnotacji do generowania tak zwanego kodu „starej metody”.
Ale nadal można używać metody onClick z niestandardowym inflatorem.
Jak używać
Realizacja
źródło
Wolałbym raczej obsługiwać kliknięcia w kodzie niż używać
onClick
atrybutu w XML podczas pracy z fragmentami.Staje się to jeszcze łatwiejsze podczas migracji działań do fragmentów. Możesz po prostu wywołać moduł obsługi kliknięć (wcześniej ustawiony na
android:onClick
XML) bezpośrednio z każdegocase
bloku.Jeśli chodzi o obsługę kliknięć we fragmentach, wydaje mi się to prostsze niż
android:onClick
.źródło
To inny sposób :
1. Utwórz BaseFragment w ten sposób:
2. Użyj
zamiast
3.W swojej działalności:
i
Mam nadzieję, że to pomoże.
źródło
W moim przypadku mam 50 nieparzystych widoków obrazu, których potrzebowałem, aby podłączyć się do jednej metody onClick. Moim rozwiązaniem jest zapętlenie widoków wewnątrz fragmentu i ustawienie tego samego detektora onclick na każdym:
źródło
Widzę odpowiedzi, że są jakoś stare. Ostatnio Google wprowadza DataBinding, które jest o wiele łatwiejsze w obsłudze przy kliknięciu lub przypisaniu pliku xml.
Oto dobry przykład, który możesz zobaczyć, jak sobie z tym poradzić:
Jest też bardzo fajny samouczek na temat DataBinding, który można znaleźć tutaj .
źródło
Odwołanie można zdefiniować jako atrybut układu XML. Artykuł Niestandardowe atrybuty XML dla niestandardowych widżetów na Androida pokaże, jak to zrobić dla niestandardowego widżetu. Podziękowania należą się Kevinowi Dionowi :)
Sprawdzam, czy mogę dodać stylowalne atrybuty do podstawowej klasy Fragment.
Podstawową ideą jest mieć tę samą funkcjonalność, którą implementuje View podczas obsługi wywołania zwrotnego onClick.
źródło
Dodając do odpowiedzi Blundell,
jeśli masz więcej fragmentów, z dużą ilością onClicks:
Czynność:
W twoim fragmencie:
źródło
Jeśli zarejestrujesz się w xml przy użyciu Androida: Onclick = "", oddzwonienie zostanie przekazane do szanowanego działania, w którego kontekście należy twój fragment (getActivity ()). Jeśli taka metoda nie zostanie znaleziona w działaniu, system zgłosi wyjątek.
źródło
Możesz rozważyć użycie EventBus dla zdarzeń oddzielonych od sprzężenia. Możesz bardzo łatwo nasłuchiwać zdarzeń. Możesz także upewnić się, że zdarzenie jest odbierane w wątku interfejsu użytkownika (zamiast wywoływać runOnUiThread .. dla siebie dla każdej subskrypcji zdarzenia)
https://github.com/greenrobot/EventBus
z Github:
źródło
Chciałbym dodać do Adjorn Linkz za odpowiedź .
Jeśli potrzebujesz wielu programów obsługi, możesz po prostu użyć referencji lambda
Sztuczka polega na tym, że
handler
podpis metody pasuje doView.OnClickListener.onClick
podpisu. W ten sposób nie będziesz potrzebowaćView.OnClickListener
interfejsu.Ponadto nie będziesz potrzebować żadnych instrukcji switch.
Niestety ta metoda jest ograniczona tylko do interfejsów wymagających jednej metody lub lambda.
źródło
Chociaż zauważyłem kilka miłych odpowiedzi opartych na wiązaniu danych, nie widziałem, aby takie podejście było w pełnym zakresie - w sensie umożliwienia rozdzielczości fragmentów, jednocześnie pozwalając na definicje układu bez fragmentów w plikach XML.
Zakładając, że powiązanie danych jest włączone, oto ogólne rozwiązanie, które mogę zaproponować; Trochę długi, ale na pewno działa (z pewnymi zastrzeżeniami):
Krok 1: Niestandardowa implementacja OnClick
Spowoduje to uruchomienie wyszukiwania uwzględniającego fragmenty poprzez konteksty powiązane z podsłuchanym widokiem (np. Przycisk):
Krok 2: Deklaratywna aplikacja w plikach układu
Następnie w plikach XML obsługujących wiązanie danych:
Ostrzeżenia
FragmentActivity
wdrożenieźródło
Działa to dla mnie: (Android studio)
źródło
Najlepsze rozwiązanie IMHO:
we fragmencie:
następnie w Fragmentie onViewStateRestored:
źródło
Twoja aktywność otrzymuje oddzwonienie, które musiało zostać użyte:
Jeśli chcesz, aby Twój fragment otrzymał wywołanie zwrotne, wykonaj następujące czynności:
i zaimplementuj
onClickListener
interfejs na Fragmentźródło