如何禁用ViewGroup所有子项的触摸事件?

11

我有一个包含许多东西(包括ScrollViewWebViewViewPager等)的FrameLayout容器。

我想能够触发该容器上的onClick事件,但似乎某些ScrollViewWebViewViewPager会截取触摸事件,因为只有在单击不包含它们任何一个部分的容器部分时才会触发onClick事件...

如何禁用容器子项上的所有触摸事件,以便能够在其中的任何位置触发onClick?

更新

想要实现类似于Android 3.2中的任务管理器,即将应用程序的当前可见屏幕显示为缩小的图标,可以点击该图标。

谢谢

2个回答

20

也许我理解错了什么,但我认为你的问题的答案非常简单: 如果你不想将任何触摸事件派发给子View - 那么你只需要像这样覆盖ViewGroup.onInterceptTouchEvent(MotionEvent ev)API reference:

public boolean onInterceptTouchEvent (MotionEvent ev){
    return true;
}

根据Android文档,这意味着您的ViewGroup将始终拦截所有触摸事件,并不将其分派给子项。 所有这些事件都将被定向到您的ViewGroup的ViewGroup.onTouchEvent(MotionEvent ev)方法。


0

您可以像这样禁用它们:

FrameLayout parent = (FrameLayout)findViewById(some_id);
disableChildsOnTouch(parent)


public void disableChildsOnTouch(ViewGroup viewGroup){
    int cnt = viewGroup.getChildCount();
    for (int i = 0; i < cnt; i++){
        View v = viewGroup.getChildAt(i);
        if (v instanceof ViewGroup){
            disableChildsOnTouch((ViewGroup)v);
        } else {
            v.setOnTouchListener(null);
            v.setOnClickListener(null);
            //v.SETYOURLISTENER(null)
        }
    }
}

当禁用所有子元素时,ScrollView仍然可以滚动,容器的onClick事件仍然无法触发... :( - jul
scrollView不应该滚动吗?如果不是,您可以测试上面的“View v”是否为scrollView,并在那里禁用滚动。我无法在如此少的信息下告诉您更多。您至少可以发布您的XML以让我看看可能出了什么问题。 - Rafael T
我已经更新了我的问题,并解释了为什么我想这样做。我认为不需要更多信息:我只是想能够触发包含诸如scrollview、viewpager之类的视图的viewgroup上的onClick事件。 - jul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接