当子视图有单击侦听器时,不会调用父视图上的OnTouchListener

时间:2020-05-04 14:22:44

标签: android android-layout ontouchlistener

<androidx.constraintlayout.widget.ConstraintLayout
    android:id="@+id/actions"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <View
        android:id="@+id/action_previous"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/action_next"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintHorizontal_weight="3"/>

    <View
        android:id="@+id/action_next"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/action_previous"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintHorizontal_weight="7"/>

</androidx.constraintlayout.widget.ConstraintLayout>

ImageActivity.kt

swipe_parent.setOnTouchListener { v, event ->
  Toast.makeText(this@ImageActivity, "OnTouch called $v, $event", Toast.LENGTH_SHORT).show()
  return@setOnTouchListener true
}

action_previous.setOnClickListener {
  Toast.makeText(this, "Previous", Toast.LENGTH_SHORT).show()
}

action_next.setOnClickListener {
  Toast.makeText(this, "Next", Toast.LENGTH_SHORT).show()
}

我读了很多评论,指出子视图是否存在onClickListener,那么OnTouchListener调用将不会传递给父视图(如果视图的结构如上所述)。从逻辑上讲,这也是有道理的,因为很难区分点击和触摸。

如果这是我的要求,如何实现?

2 个答案:

答案 0 :(得分:0)

解决此问题的最快方法是使用ontouch而不是onclick, 但是模仿onclick功能,在子视图ontouch内检查此情况,仅在action_down情况下才执行,这对您有帮助。

if (event.action == MotionEvent.ACTION_DOWN)

答案 1 :(得分:0)

我遇到了同样的问题。我通过设置解决了

android:clickable="false"
android:descendantFocusability="blocksDescendants"

在父视图中。