除非先选择视图,否则requestDisallowInterceptTouchEvent不起作用

时间:2013-01-29 15:33:29

标签: java android ontouchlistener

根据android文档,您可以获取您的父ViewGroup并在其上调用requestDisallowInterceptTouchEvent(true)以阻止其他事情干扰。这不仅导致直接父级,而且可能拦截触摸的任何其他父对象在特定事件的持续时间内忽略它...

这听起来很棒,似乎在较新的设备上运行良好(我的是android 4.1)但旧的设备(即2.3.3)它不起作用,除非我先点击我的滚动视图然后滚动它,否则其他父滚动观点可能仍然会干扰。

我在View.OnTouchListener中为可滚动的子项发送请求。

知道如何自动完成这项工作而不需要编写自定义子类来检查运动事件中的命中矩形等吗?

2 个答案:

答案 0 :(得分:14)

我也遇到了一些问题,因为它不允许间歇性地工作。

我曾经调用view.requestDisallowInterceptTouchEvent(true)而不管event.getAction()。

然后我试图成为一个好公民,并将onTouch()方法中的代码更改为以下内容:

switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            v.requestDisallowInterceptTouchEvent(true);
            break;
        case MotionEvent.ACTION_CANCEL:
        case MotionEvent.ACTION_UP:
            v.requestDisallowInterceptTouchEvent(false);
            break;
        default:
            break;
        }

请记住,此方法(或引用视图下的其他一些视图)必须返回true,父母才能遵守disallow请求。

不确定这会解决您的问题,但值得一试。

答案 1 :(得分:8)

你可以尝试这个:

m_parentScrollView.setOnTouchListener(new View.OnTouchListener() 
{
       public boolean onTouch(View p_v, MotionEvent p_event) 
        {
               m_childScrollView.getParent().requestDisallowInterceptTouchEvent(false);
           //  We will have to follow above for all scrollable contents
           return false;
        }
});

                                        **OR**

m_childScrollView.setOnTouchListener(new View.OnTouchListener() 
{
      public boolean onTouch(View p_v, MotionEvent p_event)
       {
          // this will disallow the touch request for parent scroll on touch of child view
           p_v.getParent().requestDisallowInterceptTouchEvent(true);
           return false;
       }
});