14

根据android docs,你可以让你的父母ViewGroup打电话requestDisallowInterceptTouchEvent(true)给它来阻止其他事情的干扰。这不仅会导致直接父对象,还会导致任何其他可能拦截触摸的父对象在特定事件期间忽略它......

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

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

知道如何在不借助编写自定义子类来检查运动事件等的命中矩形的情况下自动完成这项工作吗?

4

2 回答 2

18

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

我曾经调用 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 才能使父级遵守禁止请求。

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

于 2013-02-07T19:35:27.087 回答
9

你可以试试这个:

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;
       }
});
于 2014-11-27T11:03:54.963 回答