Android手势检测App意外崩溃无法启动问题求助
问题描述
- App崩溃现象:使用GestureDetector检测常见手势时,App启动即崩溃,提示“common gestures keeps stopping”,无法正常打开Activity
- 环境配置:minSdk=26,targetSdk=33,compileSdk=34,测试模拟器为Pixel 4 API 26(Android 8 Oreo)
- 核心问题代码片段:
// 原代码存在问题的类声明 abstract class MainActivity : AppCompatActivity(), GestureDetector.OnGestureListener, GestureDetector.OnDoubleTapListener { // ... 其余代码 }
崩溃原因
MainActivity被声明为抽象类(abstract),Android系统启动Activity时需要通过反射创建实例,但抽象类不允许被实例化,直接触发InstantiationException导致崩溃。
解决方案
移除MainActivity类声明前的abstract关键字,将其改为普通可实例化类:
package com.ebookfrenzy.commongestures import android.os.Bundle import android.view.GestureDetector import android.view.MotionEvent import androidx.appcompat.app.AppCompatActivity import androidx.core.view.GestureDetectorCompat import com.ebookfrenzy.commongestures.databinding.ActivityMainBinding import com.google.android.material.snackbar.Snackbar // 移除abstract关键字,改为普通类 class MainActivity : AppCompatActivity(), GestureDetector.OnGestureListener, GestureDetector.OnDoubleTapListener { var gDetector: GestureDetectorCompat? = null private lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) val mySnackbar = Snackbar.make(binding.root, "hola", Snackbar.LENGTH_SHORT) mySnackbar.show() this.gDetector = GestureDetectorCompat(this, this) gDetector?.setOnDoubleTapListener(this) } override fun onTouchEvent(event: MotionEvent): Boolean { this.gDetector?.onTouchEvent(event) return super.onTouchEvent(event) } override fun onDown(event: MotionEvent): Boolean { binding.gestureStatusText.text = "onDown" return true } override fun onFling( event1: MotionEvent?, event2: MotionEvent, velocityX: Float, velocityY: Float ): Boolean { binding.gestureStatusText.text = "onFling" return true } override fun onLongPress(event: MotionEvent) { binding.gestureStatusText.text = "onLongPress" } override fun onScroll( e1: MotionEvent?, e2: MotionEvent, distanceX: Float, distanceY: Float ): Boolean { binding.gestureStatusText.text = "onScroll" return true } override fun onShowPress(event: MotionEvent) { binding.gestureStatusText.text = "onShowPress" } override fun onSingleTapUp(event: MotionEvent): Boolean { binding.gestureStatusText.text = "onSingleTapUp" return true } override fun onDoubleTap(event: MotionEvent): Boolean { binding.gestureStatusText.text = "onDoubleTap" return true } override fun onDoubleTapEvent(event: MotionEvent): Boolean { binding.gestureStatusText.text = "onDoubleTapEvent" return true } override fun onSingleTapConfirmed(event: MotionEvent): Boolean { binding.gestureStatusText.text = "onSingleTapConfirmed" return true } }
补充说明
修改后,Android系统可以正常实例化MainActivity,App启动后就能正常捕获各类手势并更新UI。
内容的提问来源于stack exchange,提问作者carson
相关产品推荐
相关产品推荐

