【问题标题】:DrawerLayout prevents call of MainActivity.onTouchEvent()DrawerLayout 阻止调用 MainActivity.onTouchEvent()
【发布时间】:2014-01-10 09:11:50
【问题描述】:

我有一个应用程序覆盖MainActivityonTouchEvent(MotionEvent ev) 以确定Two-Finger-SwipePich-Open/Pinch-Close。 在我将DrawerLayout 添加到应用程序之前,一切正常(就像Creating a Navigation Drawer 中描述的那样)。问题:DrawerLayout 阻止在 MainActivity 中调用onTouchEvent()

我开始写CustomDrawerLayout,并尝试覆盖DrawerLayout方法onInterceptTouch()onTouchEvent()

TouchEvent 传输到 MainActivity 的唯一方法(我发现):

    // onTouchEvent of CustomDrawerLayout 
    @Override
    public boolean onTouchEvent(MotionEvent ev){
        // super.onTouchEvent(ev); // prevent transmission of TouchEvent
        return false;
    }

这里的问题是抽屉没有正确打开。抽屉卡在这篇文章中描述的那样: DrawerLayout getting stuck on swipe

是否可以将TouchEvent 传输到 MainActivity 以处理 MultiTouchDetection?还是我必须在CustomDrawerLayout 处理这个?

更新 1

首先我不得不说,如果我从左边缘滑动,抽屉只会卡住。通过单击ActionBar 中的 DrawerIcon,Drawer 可以正常工作。 TouchEvent 的传输使用以下代码。但只有在抽屉打开的情况下!否则 Activity.onTouchEvent 不会被调用!

    // onTouchEvent of CustomDrawerLayout 
    @Override
    public boolean onTouchEvent(MotionEvent ev){
        // super.onTouchEvent(ev); // still prevents transmission of TouchEvent
        activity.onTouchEvent(ev);
        return true;
    }

通过从边缘滑动打开抽屉(-> 抽屉卡住),我得到了一个非常奇怪的行为:

  • 只有 DrawerIcon 可以关闭“卡住的抽屉”(-> 我不希望有什么不同,因为我覆盖了 CustomDrawerLayout.onTouchEvent
  • 如果我通过 DrawersIcon 关闭卡住的抽屉,CustomDrawerLayout.onTouchEvent 仍会被调用

真奇怪!为什么不调用Activity.onTouchEvent()?我怎样才能防止卡住的抽屉?

更新 2

现在我覆盖CustomDrawerLayout.onInterceptTouch():

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

这具有无法通过从边缘滑动打开抽屉的效果 -> 只有 DrawersIcon 可以打开和关闭抽屉。但是现在TouchEvent 总是被传输到 Activity(-> 像预期的那样工作)。

但我真正想要的是有可能通过从边缘滑动打开抽屉 AND 来拥有我的 MultiGestureDetector。这可能吗?

【问题讨论】:

  • 从您的 CustomDrawerLayout 的 onTouchEvent 返回 true,您为什么不尝试调用 activity.onTouchEvent(ev);
  • 酷! TouchEvent 被传输到Activity。但抽屉仍然卡住......有什么想法吗?
  • 您在 CustomDrawerLayout 的 onTouchEvent 中返回 true 吗?
  • 我更详细地测试了您的建议并更新了我的问题。谢谢:)
  • 尝试了第二种可行的解决方案(更新 2),但它不是 100% 我想要的......

标签: android touch-event drawerlayout


【解决方案1】:

更新有点晚,但在遇到此问题几天后,最适合我的解决方案是创建 CustomDrawerLayout。然后,将构造函数中的 Context 转换为 Activity,从 onInterceptTouchEvent 中调用 Activity onTouchEvent。

@Override public boolean onInterceptTouchEvent( MotionEvent ev )
{
    getActivity().onTouchEvent( ev );
    return super.onInterceptTouchEvent( ev );
}

我发现代码是一个蹩脚的黑客......但对我有用。祝你好运!

【讨论】:

    【解决方案2】:

    我在识别导航抽屉本身内的项目手势时遇到了一些问题,遇到了requestDisallowInterceptTouchEvent。我发现我得到了 MotionEvent.ACTION_DOWN,但在那之后什么也没有,因为 NavigationDrawer 正在拦截触摸。关键是在 Activity 的触摸处理程序中的 down 事件上调用 requestDisallowInterceptTouchEvent(true),这样您就可以在不被拦截的情况下处理触摸。

    This presentation 在尝试找出 Android 中的触摸系统时也非常很有用。

    【讨论】:

      【解决方案3】:

      如果您或其他人仍然需要它,这是我的实现。
      完美地工作,除了“边缘”不是从android代码中获取而是作为一个常量(我设置的)。

      请查看此链接:
      Android Navigation Drawer Doesn't Pass onTouchEvent to Activity

      【讨论】:

        猜你喜欢
        • 2011-10-13
        • 1970-01-01
        • 1970-01-01
        • 2018-02-01
        • 2011-11-01
        • 2016-09-05
        • 1970-01-01
        • 1970-01-01
        • 2011-08-18
        相关资源
        最近更新 更多