为什么DrawerLayout有时会在打开时出现故障?

时间:2013-07-27 08:54:12

标签: java android android-layout navigation-drawer

我已经按照教程Navigation Drawer进行了操作,除了小故障外,一切都像魅力一样。我会尝试尽可能地解释它,如果仍然不清楚,我会尝试上传问题的视频。

当试图打开抽屉并且仅在打开时出现问题,并且有时仅发生,而不是总是发生。那是当我开始打开它时,毛刺和冻结约4毫米打开,并始终保持相同的距离。如果我把手指放回去,那么它就不会继续打开或关闭,当我放开它关闭时。

请注意:

任何指针都会受到赞赏。

2 个答案:

答案 0 :(得分:25)

我研究了DrawerLayout的代码并找到了下一个问题: 当我们触摸屏幕的边缘时,drawer会出现小的(20 *密度px)部分(它使移动抽屉更容易)。它不是立即出现,而是在一定时间间隔(160毫秒)之后出现。它由postDelayed实现。

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

因此,在某些情况下,当延迟DRAGGING正在执行时,抽屉已经移动到状态Runnable。对于20 *密度px,此延迟操作会打开drawer并更改drawer的状态。因此drawer不能再移动(因为它无法返回状态DRAGGING)。

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

不幸的是,我没有找到任何方法来取消延迟事件(因为它有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

答案 1 :(得分:1)

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