Saya pikir Anda perlu menggunakan salah satu metode tersebut agar dapat mencegat acara sebelum dikirim ke komponen yang sesuai:
Activity.dispatchTouchEvent(MotionEvent)
- Ini memungkinkan Aktivitas Anda untuk mencegat semua peristiwa sentuh sebelum dikirim ke jendela.
ViewGroup.onInterceptTouchEvent(MotionEvent)
- Ini memungkinkan ViewGroup untuk menonton acara saat dikirim ke Views turunan.
ViewParent.requestDisallowInterceptTouchEvent(boolean)
- Panggil ini pada View induk untuk menunjukkan bahwa itu tidak boleh menghalangi kejadian sentuh dengan onInterceptTouchEvent (MotionEvent).
Informasi lebih lanjut di sini .
Semoga membantu.
Luis Miguel Serrano
sumber
@Override public boolean dispatchTouchEvent(MotionEvent ev) { ... }
Nyatakan
TextView
tidak dapat diklik / difokuskan dengan menggunakanandroid:clickable="false"
danandroid:focusable="false"
atauv.setClickable(false)
danv.setFocusable(false)
. Peristiwa klik harus dikirim keTextView
induknya sekarang.catatan:
Untuk mencapai ini , Anda harus menambahkan klik ke langsung
parent
. atau setelandroid:clickable="false"
danandroid:focusable="false"
ke induk langsungnya untuk meneruskan pendengar ke induk selanjutnya .sumber
TextView#setOnClickListener()
diTextView
, itu menjadi dapat diklik, bahkan jika itu dinyatakan sebagaiandroid:clickable="false"
, dan bahkan jikaClickListener
disetel kenull
(setOnclickListener(null)
)android:inputType
atribut, atribut itu akan mengonsumsi peristiwa klik secara diam-diam bahkan dengan clickable: false & focusable: false; dalam kasus saya itu diatur dalam gaya dan saya membutuhkan waktu 30 menit untuk mencari tahu penyebabnya.Terkadang hanya ini yang membantu:
Varian lain, tidak selalu berfungsi:
sumber
CardView
sebagai pandangan anak, karenaCardView
tampaknya mengabaikanclickable="false"
danfocusable="false"
. Namun, menggunakansetOnTouchListener
dan memanggilonTouchEvent
induknya memungkinkan induk untuk menampilkan umpan balik sentuhan (misalnya efek riak).Taruh
pada anak maka tampilan mendapatkan status drawable-nya (terfokus, ditekan, dll.) dari induk langsungnya, bukan dari dirinya sendiri. Anda dapat mengatur onclick untuk orang tua dan memanggil anak diklik
sumber
Jika Anda
TextView
membuat masalah klik, daripada menghapusandroid:inputType=""
dari file xml Anda.sumber
android:inputType="none"
Jawaban ini mirip dengan jawaban Alexander Ukhov , hanya saja menggunakan peristiwa sentuh daripada peristiwa klik. Peristiwa tersebut memungkinkan induk untuk menampilkan status penekanan yang tepat (misalnya, efek riak). Jawaban ini juga ada di Kotlin, bukan di Java.
sumber
Jika Anda ingin keduanya
OnTouch
danOnClick
pendengar tampilan orang tua dan anak keduanya, gunakan trik di bawah ini:User ScrollView sebagai tampilan Parent dan di dalamnya menempatkan tampilan anak Anda di dalam Relative / LinearLayout.
Jadikan Parent ScrollView
android:fillViewport="true"
agar View tidak di-scroll.Kemudian setel
OnTouch
listener ke parent danOnClick
listener ke tampilan Child. Dan nikmati kedua panggilan balik pendengar.sumber