【问题标题】:requestDisallowInterceptTouchEvent does not work unless selecting view first除非先选择视图,否则 requestDisallowInterceptTouchEvent 不起作用
【发布时间】:2013-01-29 15:33:29
【问题描述】:

根据 android 文档,您可以让您的父母 ViewGroup 并在其上调用 requestDisallowInterceptTouchEvent(true) 以阻止其他事物干扰。这不仅会导致直接父对象,还会导致任何其他可能拦截触摸的父对象在特定事件期间忽略它...

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

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

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

【问题讨论】:

    标签: java android 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 才能使父级遵守禁止请求。

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

    【讨论】:

    • 我还没有尝试过......不幸的是情况没有改变。我的意思是我通过使用自定义子类检查父级中的事件来让它工作,但如果我不需要那样做,它会更加灵活和可扩展。可能不得不接受,如果我想支持旧版本会有一些痛苦。
    • 确认这是 onTouchEvent 的正确方法,在 ACTION_DOWN 上将 requestDisallowInterceptTouchEvent 更改为 true,在 ACTION_UP 或 ACTION_CANCEL 中更改为 false。
    【解决方案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;
           }
    });
    

    【讨论】:

      猜你喜欢
      • 2021-12-09
      • 2019-05-12
      • 1970-01-01
      • 2013-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多