请求不允许访问接触事件不起作用,除非先选择视图

2022-09-03 18:28:41

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

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

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

任何想法如何使它自动工作,而不诉诸于编写自定义子类来检查运动事件的命中矩形等?


答案 1

我在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,父级才能遵守 disallow 请求。

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


答案 2

你可以试试这个:

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;
       }
});

推荐