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



我已经在我的"活动"上实现了GestureDetector.OnEstureListener接口。它在安卓API 32上运行良好,但在将安卓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
}
}

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

这是谷歌已知的问题,它被列在问题跟踪器上https://issuetracker.google.com/issues/206855618

即使e1被定义为不可为null,Android API仍然为其生成null值

在将compileSDK版本升级到33之后,不可能成功构建项目("打开"不覆盖任何内容(

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

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

如前所述,这是一个已知的问题,应该在未来解决。

好的,我自己发现上面的代码与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
}
}

在我的案例中,函数签名在更新mindsdkversion 34后发生了更改。

在反编译的java类中,函数签名是:

boolean onScroll(@Nullable MotionEvent var1, @NonNull MotionEvent var2, float var3, float var4);

所以这个错误发生在

早些时候在科特林是:

override fun onScroll(e1: MotionEvent, e2: MotionEvent, distanceX: Float, distanceY: Float)

更改为后

override fun onScroll(e1: MotionEvent?, e2: MotionEvent, distanceX: Float, distanceY: Float)

修复了问题。

基本上,SDK 34中的第一个参数变成了Nullable。

相关内容

  • 没有找到相关文章

最新更新