Ich denke, Sie müssen eine dieser Methoden verwenden, um das Ereignis abfangen zu können, bevor es an die entsprechenden Komponenten gesendet wird:
Activity.dispatchTouchEvent(MotionEvent)
- Auf diese Weise kann Ihre Aktivität alle Berührungsereignisse abfangen, bevor sie an das Fenster gesendet werden.
ViewGroup.onInterceptTouchEvent(MotionEvent)
- Auf diese Weise kann eine ViewGroup Ereignisse überwachen, wenn sie an untergeordnete Ansichten gesendet werden.
ViewParent.requestDisallowInterceptTouchEvent(boolean)
- Rufen Sie dies bei einer übergeordneten Ansicht auf, um anzugeben, dass Berührungsereignisse nicht mit onInterceptTouchEvent (MotionEvent) abgefangen werden sollen.
Weitere Informationen hier .
Hoffentlich hilft das.
Luis Miguel Serrano
quelle
@Override public boolean dispatchTouchEvent(MotionEvent ev) { ... }
Deklarieren Sie Ihre
TextView
nicht anklickbar / fokussierbar mitandroid:clickable="false"
undandroid:focusable="false"
oderv.setClickable(false)
undv.setFocusable(false)
. Die Klickereignisse sollten jetzt an dasTextView
übergeordnete Element gesendet werden.Hinweis:
Um dies zu erreichen , müssen Sie einen Klick zu seiner direkten hinzufügen
parent
. oder setandroid:clickable="false"
undandroid:focusable="false"
an sein direktes übergeordnetes Element , um den Listener an ein weiteres übergeordnetes Element zu übergeben .quelle
TextView#setOnClickListener()
auf dieTextView
es anklickbare wird, auch wenn es als deklariert istandroid:clickable="false"
, und auch wenn die dieClickListener
festgelegt istnull
(setOnclickListener(null)
)android:inputType
Attribut gibt, werden Klickereignisse stillschweigend verbraucht, selbst wenn clickable : false & focusable: false; In meinem Fall war es in einem Stil eingestellt und es kostete mich 30 Minuten, um die Ursache herauszufinden.Manchmal hilft nur das:
Eine andere Variante funktioniert nicht immer:
quelle
CardView
als Kind Ansicht, daCardView
scheint zu ignorierenclickable="false"
undfocusable="false"
. Wenn Sie jedoch stattdessen das übergeordnete Element verwendensetOnTouchListener
und anrufen,onTouchEvent
kann das übergeordnete Element Berührungsfeedback anzeigen (z. B. Welligkeitseffekt).Stellen
Beim Kind erhalten die Ansichten dann ihren zeichnbaren Zustand (fokussiert, gedrückt usw.) von ihrem direkten Elternteil und nicht von sich selbst. Sie können onclick für Eltern festlegen und es ruft das Kind an, auf das geklickt wird
quelle
Wenn Sie
TextView
Probleme beim Erstellen von Klicks haben, entfernen Sie dieseandroid:inputType=""
aus Ihrer XML-Datei.quelle
android:inputType="none"
Diese Antwort ähnelt der Antwort von Alexander Ukhov , außer dass Touch-Ereignisse anstelle von Klickereignissen verwendet werden. Diese Ereignisse ermöglichen es dem Elternteil, die richtigen Druckzustände anzuzeigen (z. B. Welligkeitseffekt). Diese Antwort ist auch in Kotlin anstelle von Java.
quelle
Wenn Sie beide
OnTouch
undOnClick
die Eltern- und Kinderansicht beide anhören möchten , verwenden Sie bitte den folgenden Trick:Benutzer ScrollView als übergeordnete Ansicht und innerhalb dieser Ansicht Ihre untergeordnete Ansicht in Relative / LinearLayout.
Machen Sie die übergeordnete ScrollView
android:fillViewport="true"
so, dass die Ansicht nicht gescrollt wird .Stellen Sie dann den
OnTouch
Listener auf übergeordnet und denOnClick
Listener auf untergeordnete Ansichten ein. Und genießen Sie beide Hörer-Rückrufe.quelle