当前位置: 首页 > 面试题库 >

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

邹嘉荣
2023-03-14
问题内容

我遵循了“ 导航抽屉
”教程,除小故障外,其他所有内容都像魅力一样。我将尽力解释,如果仍然不清楚,我将尝试上传有关该问题的视频。

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

请注意:

  • 我已经在多种设备(Nexus 7,Nexus)和虚拟设备上进行了尝试,问题仍然存在。
  • 使用Google提供的示例复制了问题。(Youtube链接)
  • 问题与我的应用一起显示。(Youtube链接)
  • 我设法在Gmail应用程序中复制了一次该问题,但仅复制了一次(我相信使用相同的实现),但是我的应用程序和示例应用程序的复制频率更高。
  • 我注意到,如果您仅单击屏幕边缘,则毛刺会在抽屉打开的相同距离处发生,因为它在初次打开后会冻结,并且永远不会拖动。

任何指针将不胜感激。


问题答案:

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

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

因此,在某些情况下,抽屉DRAGGINGRunnable执行延迟时已经移至状态。此延迟动作打开drawer20
*密度px并更改状态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



 类似资料:
  • JAVAlang.RuntimeException:无法启动活动组件信息{com.MediaPlayer/com.MediaPlayer.MainActivity}:java。lang.SecurityException:权限拒绝:读取com。Android提供者。媒体MediaProviderURI content://media/external/audio/media from pid=18

  • 我想在RxJava中实现一个下载一些文件的处理队列。我想下载的文件数量可能高达100个左右。 一切都是在Android上使用RxJava 1.1.1开发的 我做错了什么?

  • 我已经调整了控制器构造函数和fxml,所以除了fxml构造和fxml加载之外,控制器的所有fxml设置都在fxml中。这里是我的控制器:

  • 问题内容: 我正在使用ant生成javadocs,但是一遍又一遍地获取此异常-为什么? 我正在使用JDK 1.6.0_06 版本。 问题答案: 看来这已被报告为Java错误。这似乎是由于使用了第三方库(例如JUnit)中的注释,而在Javadoc调用中不包含带有该注释的jar。 如果是这种情况,只需在javadoc上使用-classpath选项并包括额外的jar文件。

  • 问题内容: 我已经调整了控制器的构造函数和fxml,以便将控制器的fxml的所有设置都放在fxml中,除了FXML的构造和fxml的加载。这是我的控制器: 和我的fxml文件: 当调用fxmlLoader.load()并返回FXMLLoader时会发生stackoverflow fxmlLoader = new FXMLLoader(…),然后再次调用fxmlLoader.load()…为什么会发

  • 我下面的教程部分处理打印数组列表的元素。当处理小列表时,该程序完全按照我的预期运行。然而,当输入较大的数字时,字符串格式(我相信)会导致一些奇怪的结果。 我的代码如下: 使用主方法类: 输出(我只引用了足够多的内容)是: 我知道我用完了字母字符,这一行的格式: 仅用于处理“X###”格式的座位。 我想了解的是为什么会出现奇怪的字符(~"和'等)。)。显然,格式不合适。但是为什么它专门产生这个输出呢