标签: gesture-detection

错误的可空注释:在 Kotlin 上有什么方法可以克服这个问题,或者我应该使用 Java 作为解决方法吗?

背景

我在 Android 上从事一些大型项目,该项目最初 100% 用 Ja​​va 编写。当我将一些文件转换为 Kotlin 时,我发现至少有 2 种情况文档和代码声明某些函数的某些参数应该为非空,因此我也让它们在 Kotlin 上保持这种方式:

这意味着它们看起来像这样:

boolean onFling(@NonNull MotionEvent e1, @NonNull MotionEvent e2, float velocityX, float velocityY);
Run Code Online (Sandbox Code Playgroud)

问题

我通过 Crashlytics 注意到,这两种情况实际上会导致某些设备崩溃,因为它们实际上获取的是 null 值,因为 Kotlin 对此类事情非常严格(当参数设置为非 null 时获取 null)。

我尝试过的

我已经在问题跟踪器(此处此处)上报告了这一点,并且我尝试找到如何强制 Kotlin 允许参数可以为空,尽管背后的代码表明它们不能为空。可悲的是,它总是会导致“'onFling'覆盖任何内容”的错误,并且不会让我构建它。

我不知道如何做,所以现在我使用 Java。意思是这样的:

public class SimpleOnGestureListenerCompat extends GestureDetector.SimpleOnGestureListener {
    @Override
    public boolean onFling(@Nullable final MotionEvent e1, @Nullable final MotionEvent e2, final float velocityX, final float velocityY) {
        return super.onFling(e1, e2, velocityX, velocityY);
    }
} …
Run Code Online (Sandbox Code Playgroud)

java android kotlin gesture-detection

10
推荐指数
1
解决办法
1300
查看次数

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

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

android kotlin android-13 gesture-detection

8
推荐指数
2
解决办法
2329
查看次数

标签 统计

android ×2

gesture-detection ×2

kotlin ×2

android-13 ×1

java ×1