为什么抽屉布局有时会在打开时出现故障?

我已经按照教程导航抽屉,除了一个小故障之外,一切都像一个魅力一样工作。我会尽可能多地解释它,如果仍然不清楚,我会尝试上传问题的视频。

尝试打开抽屉时并且仅在打开时出现问题,并且仅有时发生,并非总是发生。那是当我开始打开它时,它会在大约4毫米打开时出现故障并冻结,并且始终具有相同的距离。然后,如果我把手指向后移,它就不会继续打开或关闭,当我放开时,它就会关闭。

请注意:

任何指示将不胜感激。


答案 1

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

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

因此,在某些情况下,抽屉已移至延迟执行时的状态。此延迟操作将打开 20*密度 px 并更改 的状态。因此无法再移动(因为它无法返回状态)。DRAGGINGRunnabledrawerdrawerdrawerDRAGGING

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

不幸的是,我没有找到任何方法来取消延迟事件(因为它有修饰符,我无法获得它)。因此,我只找到了一种方法:将源代码复制到我的项目中并进行此小更改:复制privateDrawerLayout

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;
        }

从方法到方法 。onInterceptTouchEventonTouchEvent


答案 2

抽屉布局文件中没有错误。只需将 ScrollView 作为父视图或根视图添加到内容.xml(setcontentview 文件)文件和 tools:context=”主要活动”


推荐