Jak przekazać Zdarzenie onclick widoku rodzicowi na Androidzie?

Mam TextView w układzie, którego tłem jest selektor. I tekst TextView jest ustawiony na Spanned from HTML. Następnie ustawiłem TextView za pomocą LinkMovementMethod.

Teraz, gdy dotknę widoku tekstowego, Zdarzenie click nie jest wysyłane do układu nadrzędnego, aby uruchomić selektor.

Jak to rozwiązać?

Author: Tina, 2010-12-11

7 answers

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 przechwycić wszystkie zdarzenia dotykowe, zanim zostaną wysłane do okna.

ViewGroup.onInterceptTouchEvent(MotionEvent) - umożliwia to Grupie ViewGroup obserwowanie zdarzeń wysyłanych do widoków potomnych.

ViewParent.requestDisallowInterceptTouchEvent(boolean) - wywołaj to do widoku nadrzędnego, aby wskazać, że nie powinien przechwytywać zdarzeń dotykowych z onInterceptTouchEvent (MotionEvent).

Więcej informacji tutaj .

Mam nadzieję, że to pomoże.
 47
Author: Luis Miguel Serrano,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-12 04:27:31

Zadeklaruj swoje TextView nie klikalne / focusable za pomocą android:clickable="false" i android:focusable="false" lub v.setClickable(false) i v.setFocusable(false). Zdarzenia click powinny być teraz wysyłane do rodzica TextView.

Uwaga:

aby to osiągnąć, musisz dodać click do jego bezpośredniego parent. lub ustawić android:clickable="false" i android:focusable="false" do swojego bezpośredniego rodzica , aby przekazać słuchacza dalszemu rodzicowi .

 217
Author: siyb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-03 12:48:57

Czasami tylko to pomaga:

View child = parent.findViewById(R.id.btnMoreText);
    child.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            View parent = (View) v.getParent();
            parent.performClick();
        }
    });

Inny wariant, działa nie zawsze:

child.setOnClickListener(null);
 18
Author: Alexander Ukhov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-21 05:53:06

Put

android:duplicateParentState="true"

W programie child widoki otrzymują stan drawable (focused, pressed, etc.) od swojego bezpośredniego rodzica, a nie od samego siebie. możesz ustawić onclick dla rodzica i wywoła on child clicked

 12
Author: Ahmad Ronagh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-25 09:22:08

Jeśli TextView tworzy problemy z kliknięciem, Usuń android:inputType="" z pliku xml.

 5
Author: Sanjay Chaudhary,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-29 14:18:38

Ta odpowiedź jest podobna do Alexander Ukhov ' s answer , z tą różnicą, że używa zdarzeń dotykowych zamiast zdarzeń kliknięć. Zdarzenia te pozwalają rodzicowi wyświetlać odpowiednie wciśnięte Stany (np. efekt tętnienia). Ta odpowiedź jest również w Kotlinie zamiast w Javie.

view.setOnTouchListener { view, motionEvent ->
    (view.parent as View).onTouchEvent(motionEvent)
}
 2
Author: methodsignature,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-22 12:03:10

Jeśli chcesz, aby zarówno OnTouch, jak i OnClick listener wyświetlały oba, użyj poniższej sztuczki:

  1. Widok przewijania użytkownika jako Widok nadrzędny i wewnątrz, który umieścił widok dziecka wewnątrz Relative / LinearLayout.

  2. Aby Widok nadrzędny ScrollView android:fillViewport="true" nie był przewijany.

  3. Następnie Ustaw OnTouch listener na widok rodzic, a OnClick listener na widok potomny. I cieszyć się zarówno wywołań słuchacza.

 0
Author: Kishor Patil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-24 13:11:01