为什么DrawerLayout在打开时有时会出现问题?

我遵循教程导航抽屉 ,一切都像一个魅力,除了一个小毛刺。 我会尽量解释它,如果还不清楚,我会尝试上传一个问题的video。

试图打开抽屉时才会出现问题,而且只有在打开时才会出现问题,而且有时会发生,而不总是。 那就是当我开始打开它时,它会以大约4毫米的距离打开,并始终保持相同的距离。 如果我把手指放回去,那么当我放开时,它就不会继续开放也不会closures。

请注意:

  • 我试过多个设备(Nexus 7,Nexus)和虚拟设备,问题依然存在。
  • 使用Google提供的示例复制问题。 (Youtube链接)
  • 问题出现在我的应用程序。 (Youtube链接)
  • 我设法复制了这个问题一次,但只有一次在Gmail应用程序(我相信使用相同的实现),但是更频繁与我的应用程序和示例应用程序。
  • 我注意到,如果您只是单击屏幕边缘,就会在与抽屉打开的距离相同的距离处发生故障,因为在初始打开之后它会冻结,从不拖动。

任何指针将不胜感激。

Solutions Collecting From Web of "为什么DrawerLayout在打开时有时会出现问题?"

我研究了DrawerLayout的代码,发现下一个问题:当我们触摸屏幕的边缘时,出现小的(20 *密度px)部分的drawer (这使得抽屉更容易移动)。 它不是立即出现,而是经过一段时间(160毫秒)。 它是由postDelayed实现的。

drawer可以有几种状态: IDLEDRAGGINGDRAGGING 。 如果它处于DRAGGING状态,则不能用相同的指针和边缘返回到此状态(因为存在条件: mEdgeDragsInProgress[pointerId] & edge) == edge不允许拖动已经已经拖动)。

所以在某些情况下,当延迟Runnable执行时,抽屉已经移到状态DRAGGING 。 这个延迟动作打开drawer 20 *密度px和改变drawer状态。 所以drawer不能再被移动(因为它不能返回到状态DRAGGING )。

有一个取消延迟动作(打开抽屉)的代码,但是这个代码在onInterceptTouchEvent方法中,只调用一次(因为它返回false )。 我认为这个代码应该在onTouchEvent方法中。

不幸的是我没有find任何方法取消延迟事件(因为它有private修改,我不能得到它)。 所以只有一种方法,我发现:将DrawerLayout的源代码复制到我的项目,并作出这个小的改变:复制

 case MotionEvent.ACTION_MOVE: { // If we cross the touch slop, don't perform the delayed peek for an edge touch. if (mLeftDragger.checkTouchSlop(ViewDragHelper.DIRECTION_ALL)) { mLeftCallback.removeCallbacks(); mRightCallback.removeCallbacks(); } break; } 

onInterceptTouchEvent方法到onTouchEvent方法。

drawerlayout文件中没有错误。 只需将一个ScrollView作为父视图或根视图添加到content.xml(setcontentview文件)文件和工具:context =“。MainActivity”