Myślę, że musisz użyć jednej z tych metod, aby móc przechwycić zdarzenie, zanim zostanie wysłane do odpowiednich komponentów:
Activity.dispatchTouchEvent(MotionEvent)
- Dzięki temu Twoja aktywność może przechwytywać wszystkie zdarzenia dotykowe przed wysłaniem ich do okna.
ViewGroup.onInterceptTouchEvent(MotionEvent)
- Dzięki temu ViewGroup może obserwować zdarzenia, gdy są one wysyłane do podrzędnych widoków.
ViewParent.requestDisallowInterceptTouchEvent(boolean)
- Wywołaj to w widoku nadrzędnym, aby wskazać, że nie powinien przechwytywać zdarzeń dotykowych za pomocą onInterceptTouchEvent (MotionEvent).
Więcej informacji tutaj .
Mam nadzieję, że to pomoże.
Luis Miguel Serrano
źródło
@Override public boolean dispatchTouchEvent(MotionEvent ev) { ... }
Zadeklaruj, że
TextView
nie możesz kliknąć / ustawić fokusu, używającandroid:clickable="false"
iandroid:focusable="false"
lubv.setClickable(false)
iv.setFocusable(false)
. Zdarzenia kliknięcia powinny teraz zostać wysłane doTextView
rodzica użytkownika.Uwaga:
Aby to osiągnąć , musisz dodać kliknięcie do jego bezpośredniego
parent
. lub setandroid:clickable="false"
iandroid:focusable="false"
do swojego bezpośredniego rodzica, aby przekazać słuchacz do kolejnego rodzica .źródło
TextView#setOnClickListener()
naTextView
, staje się interaktywna, nawet jeśli jest to uznane zaandroid:clickable="false"
, a nawet jeśli TheClickListener
jest ustawiony nanull
(setOnclickListener(null)
)android:inputType
atrybut, będzie on dyskretnie konsumował zdarzenia kliknięcia, nawet w przypadku klikalności: false & focusable: false; w moim przypadku było to stylowe i zajęło mi 30 minut, aby znaleźć przyczynę.Czasami tylko to pomaga:
Inny wariant, nie zawsze działa:
źródło
CardView
jak dziecko, ponieważCardView
wydaje się ignorowaćclickable="false"
ifocusable="false"
. Jednak używaniesetOnTouchListener
i wywoływanieonTouchEvent
rodzica zamiast tego umożliwia rodzicowi wyświetlanie informacji zwrotnych na dotyk (np. Efekt tętnienia).Położyć
u dziecka wtedy widoki uzyskują swój ciągliwy stan (skupiony, wciśnięty itp.) od swojego bezpośredniego rodzica, a nie od siebie samego. możesz ustawić onclick dla rodzica i wywołanie kliknięcia dziecka
źródło
Jeśli masz
TextView
problemy z kliknięciem, usuńandroid:inputType=""
z pliku xml.źródło
android:inputType="none"
Ta odpowiedź jest podobna do odpowiedzi Aleksandra Ukhova , z tym wyjątkiem, że wykorzystuje zdarzenia dotykowe, a nie zdarzenia kliknięcia. Te zdarzenia pozwalają rodzicowi wyświetlać odpowiednie stany wciśnięcia (np. Efekt tętnienia). Ta odpowiedź jest również w Kotlinie zamiast w Javie.
źródło
Jeśli chcesz, aby oba
OnTouch
iOnClick
słuchacza do rodzicem a dzieckiem widzenia zarówno proszę skorzystać z poniższego trick:User ScrollView jako widok nadrzędny i wewnątrz, który umieścił widok podrzędny w Relative / LinearLayout.
Ustaw Parent ScrollView,
android:fillViewport="true"
aby widok nie był przewijany.Następnie ustaw
OnTouch
odbiornik na rodzica, aOnClick
odbiornik na widoki podrzędne. I ciesz się połączeniami zwrotnymi dla obu słuchaczy.źródło