我已经在我的"活动"上实现了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。