Tất cả các câu trả lời trên đều đúng nhưng kết quả là khác nhau nếu View có clickable
hay khôngclickable
Ví dụ , tôi có một LinearLayout
chứa 1 Button
và 1 TextView
như thế này
<LinearLayout
android:id="@+id/linearlayout_root"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#0aa"
android:orientation="vertical">
<Button
android:id="@+id/button_click"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="40dp"
android:text="Button Click"
android:textSize="20sp" />
<TextView
android:id="@+id/textview_click"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="40dp"
android:text="TextView Click"
android:textSize="20sp"
android:background="#e4e4e4"
/>
</LinearLayout>
Trong Hoạt động, tôi có mã như
class MainActivity : AppCompatActivity() {
val TAG = "TAG"
@SuppressLint("ClickableViewAccessibility")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
findViewById<LinearLayout>(R.id.linearlayout_root).setOnTouchListener { v, event ->
Log.i(TAG, "LinearLayout onTouch event " + getDisplayAction(event.action))
false
}
findViewById<Button>(R.id.button_click).setOnTouchListener { v, event ->
Log.i(TAG, "Button onTouch event " + getDisplayAction(event.action))
false
}
findViewById<TextView>(R.id.textview_click).setOnTouchListener { v, event ->
Log.i(TAG, "TextView onTouch event " + getDisplayAction(event.action))
false
}
}
private fun getDisplayAction(action: Int): String {
return when (action) {
MotionEvent.ACTION_DOWN -> "DOWN"
MotionEvent.ACTION_MOVE -> "MOVE"
MotionEvent.ACTION_UP -> "UP"
MotionEvent.ACTION_CANCEL -> "CANCEL"
MotionEvent.ACTION_OUTSIDE -> "OUTSIDE"
else -> "UNKNOWN"
}
}
}
Trường hợp 1 Linear onTouch return **FALSE**
, Button onTouch return **FALSE**
,TextView onTouch return **FALSE**
Nhấp vào nút
I/TAG: Button onTouch eventDOWN
I/TAG: Button onTouch eventMOVE
I/TAG: Button onTouch eventUP
Nhấp vào TextView
TAG: TextView onTouch eventDOWN
TAG: LinearLayout onTouch eventDOWN
Nhấp vào LinearLayout
TAG: LinearLayout onTouch eventDOWN
Trường hợp 2 Linear onTouch return **FALSE**
, Button onTouch return **TRUE**
,TextView onTouch return **TRUE**
Nhấp vào nút
Similar to case 1
Nhấp vào TextView
TAG: TextView onTouch event DOWN
TAG: TextView onTouch event MOVE
TAG: TextView onTouch event UP
Nhấp vào LinearLayout
Similar to case 1
Trường hợp 3 Linear onTouch return **TRUE**
, Button onTouch return **FALSE**
,TextView onTouch return **FALSE**
Nhấp vào nút
Similar to case 1
Nhấp vào TextView
TAG: TextView onTouch event DOWN
TAG: LinearLayout onTouch event DOWN
TAG: LinearLayout onTouch event MOVE
TAG: LinearLayout onTouch event UP
Nhấp vào LinearLayout
TAG: LinearLayout onTouch event DOWN
TAG: LinearLayout onTouch event MOVE
TAG: LinearLayout onTouch event UP
Ghi chú
- Mặc định
TextView
là not clickable
, nó sẽ trở nên có thể nhấp được nếu chúng ta đặt android:clickable="true"
trong xml HOẶC khi chúng ta đặttextView.setOnClickListener(...)
- Khi bạn gỡ lỗi,
event MOVE
có thể gọi nhiều hơn nhật ký của tôi (nó dựa trên cách bạn chạm vào)
Tóm lược
onTouch
trả lại true
hoặc xem là clickable
, View sẽ nhận tất cả onTouchEvent
onTouch
quay lại false
và xem thì không clickable
, chế độ xem sẽ không nhận được NEXT onTouchEvent (cha mẹ của nó có thể nhận được)
Hy vọng nó sẽ giúp
DEMO