DrawerLayout阻止调用MainActivity.onTouchEvent()

时间:2014-01-10 09:11:50

标签: android ontouchevent drawerlayout

我的应用会覆盖onTouchEvent(MotionEvent ev)的{​​{1}}以确定MainActivityTwo-Finger-Swipe / Pich-Open。 一切正常,直到我将Pinch-Close添加到应用程序(如Creating a Navigation Drawer中所述)。问题:DrawerLayout阻止了在MainActivity中调用DrawerLayout

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

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

TouchEvent

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

是否可以将 // onTouchEvent of CustomDrawerLayout @Override public boolean onTouchEvent(MotionEvent ev){ // super.onTouchEvent(ev); // prevent transmission of TouchEvent return false; } 传输到MainActivity来处理MultiTouchDetection?或者我必须在TouchEvent处理此问题?

更新1

首先我不得不说,如果我从左边缘滑动,抽屉只会卡住。点击CustomDrawerLayout中的DrawerIcon,抽屉工作正常。 ActionBar的传输使用以下代码。但只有抽屉被打开!否则TouchEvent不会被调用!

Activity.onTouchEvent

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

  • 只是DrawerIcon可以关闭“卡住的抽屉”( - >我不会期望有什么不同,因为我覆盖了 // onTouchEvent of CustomDrawerLayout @Override public boolean onTouchEvent(MotionEvent ev){ // super.onTouchEvent(ev); // still prevents transmission of TouchEvent activity.onTouchEvent(ev); return true; }
  • 如果我通过DrawersIcon关闭被卡住的抽屉,CustomDrawerLayout.onTouchEvent仍称为
这很奇怪!为什么不调用CustomDrawerLayout.onTouchEvent?我怎样才能防止被卡住的抽屉?

更新2

现在我覆盖Activity.onTouchEvent()

CustomDrawerLayout.onInterceptTouch()

这导致无法通过从边缘轻扫来打开抽屉 - >只有DrawersIcon才能打开和关闭抽屉。但现在@Override public boolean onInterceptTouchEvent(MotionEvent ev){ return true; } 始终传输到活动( - >按预期工作)。

但我真正想要的是通过从边缘滑动来打开抽屉的可能性,以获得我的MultiGestureDetector。这可能吗?

3 个答案:

答案 0 :(得分:3)

稍微更新了一段时间,但在这个问题出现几天之后,最适合我的解决方案是创建一个CustomDrawerLayout。然后,将构造函数中的Context作为Activity转换,从onInterceptTouchEvent调用Activity onTouchEvent。

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

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

答案 1 :(得分:0)

我在导航抽屉本身识别项目的手势时遇到了一些问题,并遇到requestDisallowInterceptTouchEvent。我发现我得到的是MotionEvent.ACTION_DOWN,但之后没有任何内容,因为NavigationDrawer正在拦截触摸。关键是在活动中的触摸处理程序中对down事件调用requestDisallowInterceptTouchEvent(true),以便您可以在不被截获的情况下处理触摸。

在尝试找出Android中的触控系统时,

This presentation也非常有用

答案 2 :(得分:0)

如果您或其他人仍然需要它,这是我的实施 除了没有从Android代码中获取的“边缘”但作为常量(我设置)之外,完美地工作。

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