Kiedy pokazuję jeden fragment (pełny ekran z #77000000
tłem) nad innym (nazwijmy go głównym), mój główny fragment nadal reaguje na kliknięcia (możemy kliknąć przycisk, nawet jeśli go nie widzimy).
Pytanie : jak zapobiec kliknięciom pierwszego (głównego) fragmentu?
EDYTOWAĆ
Niestety nie mogę po prostu ukryć głównego fragmentu, ponieważ używam przezroczystego tła na drugim fragmencie (więc użytkownik może zobaczyć, co znajduje się za).
android
android-fragments
Dmitrij Zajcew
źródło
źródło
Visibility
swójmain
Fragment
na,GONE
kiedy go nie używasz.onClick
metoda nic nie zwraca. Ale dajesz pomysł, dzięki (wkrótce opublikuję odpowiedź).Odpowiedzi:
Ustaw
clickable
właściwość w widoku drugiego fragmentu na wartość true. Widok uchwyci zdarzenie, aby nie zostało przekazane do głównego fragmentu. Więc jeśli widok drugiego fragmentu jest układem, byłby to kod:źródło
RelativeLayout
wnętrze fragmentu i ustawiam cały widok za pomocąclickeable
właściwości. Rozwiązanie @Dmitry rozwiązuje mój problem.Rozwiązanie jest dość proste. W naszym drugim fragmencie (który pokrywa się z naszym głównym fragmentem) musimy po prostu złapać
onTouch
zdarzenie:źródło
Wystarczy dodać
clickable="true"
ifocusable="true"
do układu nadrzędnegoJeśli używasz
AndroidX
, spróbuj tegoźródło
focuseable
nie jest tak naprawdę konieczne.focusable="true"
tutaj jest tylko po to, aby uniknąć ostrzeżenia w Android Studio.Powinieneś ukryć pierwszy fragment, gdy wyświetlasz drugi fragment, jeśli dwa fragmenty są umieszczone w tym samym widoku pojemnika.
źródło
Musisz dodać za
android:focusable="true"
pomocąandroid:clickable="true"
Clickable
oznacza, że można go kliknąć wskaźnikiem lub dotknąć urządzeniem dotykowym.Focusable
oznacza, że może uzyskać ostrość z urządzenia wejściowego, takiego jak klawiatura. Urządzenia wejściowe, takie jak klawiatury, nie mogą decydować, do którego widoku mają wysyłać zdarzenia wejściowe na podstawie samych danych wejściowych, więc wysyłają je do widoku, który jest aktywny.źródło
Jest więcej niż jedno rozwiązanie, które niektórzy z nas przyczynili się do tego wątku, ale chciałbym też wspomnieć o innym rozwiązaniu. Jeśli nie masz ochoty umieszczać klikalnego i możliwego do skupienia, równego wierności z głównym układem każdego układu, ViewGroup w XML takim jak ja. Możesz także umieścić go w swojej bazie, jeśli masz taką jak poniżej;
Mam nadzieję, że pomoże to tym, którzy nie znoszą plików XML układu.
źródło
Dopuszczalna odpowiedź „zadziała”, ale spowoduje również koszty wydajności (przesadzenie, ponowny pomiar przy zmianie orientacji), ponieważ fragment na dole jest nadal rysowany. Być może powinieneś po prostu znaleźć fragment według tagu lub identyfikatora i ustawić widoczność na BRAK lub WIDOCZNIE, gdy chcesz ponownie wyświetlić.
W Kotlinie:
To rozwiązanie jest lepsze niż alternatywa
hide()
ishow()
metodyFragmentTransaction
korzystania z animacji. Po prostu nazywaj to odonTransitionStart()
andonTransitionEnd()
ofTransition.TransitionListener
.źródło
Metod 1:
Możesz dodać do układu wszystkich fragmentów
Metod 2: (programowo)
Rozszerz cały fragment z
FragmentBase
itd. Następnie dodaj ten kod doFragmentBase
źródło
Możesz tylko kliknąć puste miejsce w układzie poprzedniego fragmentu, używając właściwości onClick do układu nadrzędnego tego głównego fragmentu, aw działaniu możesz utworzyć funkcję
doNothing(View view)
i nic w niej nie pisać. To zrobi to za ciebie.źródło
To brzmi jak skrzynka dla DialogFragment. W przeciwnym razie przy pomocy Fragment Managera jeden z nich ukryje, a drugi pokaże. To zadziałało dla mnie.
źródło
Dodanie
android:clickable="true"
nie działało dla mnie. To rozwiązanie nie działa w CoordinatorLayout, gdy jest to układ nadrzędny. Właśnie dlatego utworzyłem RelativeLayout jako układ nadrzędny, dodałemandroid:clickable="true"
do niego i umieściłem CoordinatorLayout na tym RelativeLayout.źródło
Miałem wiele fragmentów z tym samym xml.
Po spędzeniu godzin usunąłem
setPageTransformer
i zaczęło działaćMiałem logikę oszustwa.
źródło