webentwicklung-frage-antwort-db.com.de

Wie übergibt man das onClick-Ereignis einer Ansicht an das übergeordnete Element bei Android?

Ich habe eine Textansicht in einem Layout, dessen Hintergrund eine Auswahl ist. Und der Text von TextView wird aus HTML .. auf Spanned gesetzt .. Dann setze ich die TextView mit der LinkMovementMethod.

Wenn ich nun auf die TextView-Komponente tippe, wird das Klickereignis nicht an das übergeordnete Layout gesendet, um den Selektor auszulösen.

Wie soll das gelöst werden?

84
shiami

Ich denke, Sie müssen eine dieser Methoden verwenden, um das Ereignis abzufangen, bevor es an die entsprechenden Komponenten gesendet wird:

Activity.dispatchTouchEvent(MotionEvent) - Dadurch kann Ihre Aktivität alle Berührungsereignisse abfangen, bevor sie an das Fenster gesendet werden.

ViewGroup.onInterceptTouchEvent(MotionEvent) - Damit kann eine ViewGroup Ereignisse beobachten, während sie an untergeordnete Ansichten gesendet werden.

ViewParent.requestDisallowInterceptTouchEvent(boolean) - Rufen Sie diese Option für eine übergeordnete Ansicht auf, um anzugeben, dass Berührungsereignisse mit onInterceptTouchEvent (MotionEvent) nicht abgefangen werden sollen.

Weitere Informationen hier .

Hoffentlich hilft das.

43

Deklarieren Sie Ihr TextView nicht anklickbar/fokussierbar, indem Sie Android:clickable="false" und Android:focusable="false" oder v.setClickable(false) und v.setFocusable(false) verwenden. Die Klickereignisse sollten jetzt an das übergeordnete Element von TextView gesendet werden.

Hinweis:

Um dies zu erreichen, müssen Sie click zu seinem direkten parent hinzufügen. oder setzen Sie Android:clickable="false" und Android:focusable="false" auf seine direkte übergeordnete, um den Listener an weitere übergeordnete zu übergeben.

185
siyb

Manchmal hilft nur das:

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

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

Eine andere Variante funktioniert nicht immer:

child.setOnClickListener(null);
14
Alexander Ukhov

Stellen

Android:duplicateParentState="true"

in child erhalten die Ansichten dann ihren gezeichneten Status (fokussiert, gedrückt usw.) von ihrem direkten übergeordneten Element und nicht von sich selbst. Sie können onclick für das übergeordnete Element setzen, und es wird ein Aufruf des untergeordneten Elements aufgerufen

8
Ahmad Ronagh

Wenn Ihre TextView Klickprobleme erstellt, entfernen Sie Android:inputType="" aus Ihrer XML-Datei. 

3

Wenn Sie sowohl OnTouch als auch OnClick Listener für übergeordnete und untergeordnete Elemente anzeigen möchten, verwenden Sie bitte den folgenden Trick:

  1. Benutzer-ScrollView als übergeordnete Ansicht und innerhalb dieser Ansicht platzierte Ihre untergeordnete Ansicht in Relative/LinearLayout.

  2. Parent ScrollView Android:fillViewport="true" erstellen, damit View nicht gescrollt wird.

  3. Setzen Sie dann OnTouch listener auf parent und OnClick listenener auf Child-Ansichten . Und genießen Sie beide Rückrufe des Listeners.

0
Kishor Patil

Diese Antwort ähnelt der Antwort von Alexander Ukhov , nur dass hier eher Touch-Events als Klick-Events verwendet werden. Diese Ereignisse ermöglichen es dem übergeordneten Element, die richtigen gedrückten Zustände anzuzeigen (z. B. Welligkeitseffekt). Diese Antwort findet sich auch in Kotlin statt in Java.

view.setOnTouchListener { view, motionEvent ->
    (view.parent as View).onTouchEvent(motionEvent)
}
0
methodsignature