【问题标题】:onTouchEvent() causes "unfortunately app has stopped"onTouchEvent() 导致“不幸的是应用程序已停止”
【发布时间】:2017-03-07 09:33:43
【问题描述】:

我正在编写一个游戏,您可以在其中按住屏幕让直升机飞行。现在,当直升机与屏幕边框(单个设备的高度和宽度)相撞时,活动结束

((Activity) context).finish();

当玩家在碰撞后快速停止时它工作得很好,但如果他坚持下去,我会得到讨厌的错误。

这就是我怀疑 onTouchEvent 方法的原因

@Override
public boolean onTouchEvent(MotionEvent event) {
    // background music
    mp.start();
    mp.setLooping(true);
    copter.setVolume((float) 0.2, (float) 0.2);
    if (event.getAction() == MotionEvent.ACTION_DOWN && fuel > 0) {
        copter.start();
        copter.setLooping(true);
        if (!player.getPlaying()) {
            player.setPlaying(true);
            player.setUp(true);
            fuel--;
        } else {
            player.setUp(true);
            fuel--;
        }
        return true;
    }
    if (event.getAction() == MotionEvent.ACTION_UP) {
        copter.pause();
        player.setUp(false);
        return true;
    }
    return super.onTouchEvent(event);
}

有没有办法在碰撞后忽略 TouchEvents?还是 OnTouchEvent 甚至都不是问题?

【问题讨论】:

  • 无需怀疑任何事情。去看看你的应用程序日志。在那里你会看到崩溃发生的确切位置。
  • 请分享来自 logcat 的错误堆栈跟踪

标签: android view draw touch-event


【解决方案1】:

检查onTouchEvent()内的Activity是否为空

代码如下:

@Override
public boolean onTouchEvent(MotionEvent event) {
    Activity activity = getActivity();
    if(activity != null){
        // background music
        mp.start();
        mp.setLooping(true);
        copter.setVolume((float) 0.2, (float) 0.2);
        if (event.getAction() == MotionEvent.ACTION_DOWN && fuel > 0) {
            copter.start();
            copter.setLooping(true);
            if (!player.getPlaying()) {
                player.setPlaying(true);
                player.setUp(true);
                fuel--;
            } else {
                player.setUp(true);
                fuel--;
            }
            return true;
        }
        if (event.getAction() == MotionEvent.ACTION_UP) {
            copter.pause();
            player.setUp(false);
            return true;
        }
        return super.onTouchEvent(event);
    }
    //return super.onTouchEvent(event);
    return false;
}

根据您应该使用的代码:

if(((Activity)context) != null){

而不是

Activity activity = getActivity();
if(activity != null){

如果这不是问题,请添加错误堆栈跟踪。


更新

通过电子邮件发送堆栈跟踪:

Intent mailIntent = new Intent(Intent.ACTION_SENDTO);
mailIntent.setData(Uri.parse("mailto:"));
mailIntent.putExtra(Intent.EXTRA_EMAIL, new String[]{"mail@gmail.com"});
mailIntent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
mailIntent.putExtra(Intent.EXTRA_TEXT, stacktraceText);
Intent mailChooserIntent = Intent.createChooser(mailIntent, "Title");

context.startActivity(mailChooserIntent);

【讨论】:

  • GamePanel 类型的 getActivity() 方法未定义,所以我使用了
  • GamePanel 活动 = GamePanel.this;而是
  • 你可以使用你正在使用的相同来完成我假设的活动:((活动)上下文)
  • 做到了,但不幸的是得到了同样的错误:(谢谢你
  • 现在试试,我改了返回逻辑。请复制您的错误堆栈跟踪
猜你喜欢
  • 2016-10-03
  • 2018-03-23
  • 2015-05-09
  • 2016-11-19
  • 2016-11-27
  • 2014-10-20
  • 1970-01-01
相关资源
最近更新 更多