将触摸事件传递给父视图

Sri*_*lla 35 android android-layout android-listview

我有一个自定义ViewSwitcher,我实现了触摸事件,所以我可以使用触摸屏滚动屏幕.

我的布局层次结构如下所示:

<ViewSwitcher>

    <LinearLayout>
        <ListView />
    </LinearLayout>

    <LinearLayout>
        <ListView />
    </LinearLayout>

</ViewSwitcher>
Run Code Online (Sandbox Code Playgroud)

现在,问题是触摸事件正被消耗 ListViews,我无法切换视图.当我没有时,它工作正常ListViews.我需要能够滚动浏览视图并滚动查看ListView.

我该如何解决这个问题?

编辑:我还需要ListView可点击的项目.

提前致谢!

Sri*_*lla 78

谢谢大家回答这个问题.但我能够以更简单的方式解决这个问题.由于我ViewSwitcher没有检测到触摸事件,我拦截了触摸事件,称为onTouchEvent()并返回false.这里:

@Override
public boolean onInterceptTouchEvent(MotionEvent ev)
{
    onTouchEvent(ev);
    return false;
}
Run Code Online (Sandbox Code Playgroud)

通过覆盖onInterceptTouchEvent(),我能够拦截活动中的触摸事件.然后我叫onTouchEvent()ViewSwitcher它处理的切换ListViews.最后通过返回false,它确保ViewGroup不消耗事件.

  • 我不认为这是在onInterceptTouchEvent()中调用onTouchEvent()的"官方"方式,除非这意味着某种黑客攻击.因为如果从onInterceptTouchEvent()返回true,将会调用onTouchEvent(). (6认同)
  • 有关此答案的更多信息(以正确的方式完成),位于:https://developer.android.com/training/gestures/viewgroup.html (2认同)

mac*_*Jun 10

将子视图的TouchEvent传递给父视图的最简单方法是将其添加到子视图:

@Override
public boolean onTouchEvent(MotionEvent event) { 
    super.onTouchEvent(event);
    return false;
}
Run Code Online (Sandbox Code Playgroud)

  • 这是我为RecyclerView工作的唯一解决方案.看起来您必须扩展RecyclerView,覆盖onTouchEvent并禁用其上的任何进一步交互,并继续事件链. (3认同)
  • 当我将其添加到回收器视图时,列表项不接受点击事件 (3认同)

luc*_*992 5

在我的父布局中,我发现阻止孩子捕获触摸事件的唯一方法是覆盖 onInterceptTouchEvent 以返回 true。

@Override
public boolean onInterceptTouchEvent(MotionEvent ev)
{
    return true;
}
Run Code Online (Sandbox Code Playgroud)