GestureDetector.OnGestureListener 重写方法在 Android API 33 中不起作用

Fer*_*han 8 android kotlin android-13 gesture-detection

我已经在我的 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
    }
}
Run Code Online (Sandbox Code Playgroud)

Rio*_*994 10

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

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

即使 e1 定义为不可空,Android API 仍然会为其生成空值。

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

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

override fun onFling(
            e1: MotionEvent?,
... )
Run Code Online (Sandbox Code Playgroud)

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


Fer*_*han 8

好吧,我自己发现上面的代码在 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
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 删除“?”可能会导致应用程序崩溃。因为 Motion 事件仍然可以为空 (2认同)