You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 04:55:26