Android滑动手势不适用于子视图

时间:2019-01-04 21:25:47

标签: java android android-activity

我有一个带有一些可单击视图的布局。 我已经按照this实现了滑动手势。 如果您在空白区域内滑动,则效果很好,但如果开始在布局内的一个视图内滑动,则此方法将无效。

如何避免这种情况?向活动中的单个视图添加onSwipeListener似乎很疯狂。有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

在子视图中设置android:clickable=false。这样可以防止他们拦截来自父级的触摸事件。

答案 1 :(得分:1)

我针对此问题的可行解决方案是在视图上方使用带有子项的不可见层,如下所示:

  <RelativeLayout
        android:id="@+id/contentLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_above="@+id/linearLayout"
        android:layout_alignStart="@+id/linearLayout"
        android:layout_alignParentTop="true"> ... </RelativeLayout>
  <View
        android:id="@+id/gesture_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_above="@+id/linearLayout"
        android:layout_alignStart="@+id/linearLayout"
        android:layout_alignParentTop="true"
        android:focusable="true"
        android:focusableInTouchMode="true" />

其中contentLayout包含多个孩子,其中包括一些按钮。

第二步是在此gesture_view上捕获触摸事件,并将它们代理到linearLayout和我的GestureDetector代码(类似于您在问题上链接的代码),如下所示:

gesture_view.setOnTouchListener { _, event ->
    contentLayout.dispatchTouchEvent(event)
    gestureListener.onTouch(event)
    true
}

注意,您需要注意如何将事件传递到gesture_view后面的视图中。简直contentLayout#onTouch不起作用。它必须是contentLayout.dispatchTouchEvent