【问题标题】:GestureDetector.OnGestureListener overridden methods are not working in Android API 33GestureDetector.OnGestureListener 覆盖的方法在 Android API 33 中不起作用
【发布时间】:2022-12-21 21:37:27
【问题描述】:

我已经在我的 Activity 上实现了接口 GestureDetector.OnGestureListener。它在 Android API 32 上运行良好,但在将 Android API 级别从 32 更新到 33 后,我无法覆盖它的方法。当我回滚到 Android API 32 时,它工作正常。

这是我实现接口的方式:

class ABCActivity: AppCompatActivity(), GestureDetector.OnGestureListener {
    
    override fun onDown(p0: MotionEvent?): Boolean = false

    override fun onShowPress(p0: MotionEvent?) = Unit

    override fun onSingleTapUp(p0: MotionEvent?): Boolean = false

    override fun onLongPress(p0: MotionEvent?) = Unit

    override fun onFling(p0: MotionEvent?, p1: MotionEvent?, p2: Float, p3: Float): Boolean = false

    override fun onScroll(
        event: MotionEvent?,
        event1: MotionEvent?,
        distanceX: Float,
        distanceY: Float
    ): Boolean {
        // My Logic
    }
}

【问题讨论】:

  • 请发布您的 onGestureListener 的实际完整代码。屏幕截图非常无用

标签: android kotlin android-13 gesture-detection


【解决方案1】:

好的,我自己发现上面的代码与 API 级别 32 完美配合并导致 API 级别 33 出现问题,原因是 ? 运算符和 MotionEvent。我刚刚删除了它,它也适用于 API 级别 33。新代码如下所示。

class ABCActivity: AppCompatActivity(), GestureDetector.OnGestureListener {

    override fun onDown(p0: MotionEvent): Boolean = false

    override fun onShowPress(p0: MotionEvent) = Unit

    override fun onSingleTapUp(p0: MotionEvent): Boolean = false

    override fun onLongPress(p0: MotionEvent) = Unit

    override fun onFling(p0: MotionEvent, p1: MotionEvent, p2: Float, p3: Float): Boolean = false

    override fun onScroll(
        event: MotionEvent,
        event1: MotionEvent,
        distanceX: Float,
        distanceY: Float
    ): Boolean {
        // My Logic
    }
}

【讨论】:

  • 删除 ? 可能会导致应用程序崩溃。因为 Motion 事件仍然可以为空
【解决方案2】:

正如 Vlad 所说“删除 ? 可能会导致应用程序崩溃。因为 Motion 事件仍然可以为空”

这是 Google 的一个已知问题,列在问题跟踪器 https://issuetracker.google.com/issues/206855618

即使 e1 被定义为不可为 null,Android API 仍然会为它生成一个 null 值。

将 compileSDK 版本升级到 33 后,无法成功构建项目('onFling' 不覆盖任何内容)

解决此问题的一种方法是添加 @Suppress("NOTHING_TO_OVERRIDE", "ACCIDENTAL_OVERRIDE") 并将 e1 设置为可为空

override fun onFling(
            e1: MotionEvent?,
... )

此外,您可能需要return super.onFling(e1 ?: e2, e2, ...) 来避免生成空值时发生崩溃。

如前所述,这是一个已知问题,应该在将来修复。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-13
    • 1970-01-01
    相关资源
    最近更新 更多