尝试切换到其他活动时Android应用程序崩溃

时间:2016-04-18 17:49:57

标签: android android-intent android-activity

我在我的应用中遇到了一个问题。当我的游戏结束时(life == 0)我试图通过使用不同的活动切换到屏幕上的游戏。当游戏结束时,应用程序就会崩溃。我已经为我要切换的活动包含了XML,并指出了应用程序崩溃的位置。如果有人能提供帮助,那就太好了!感谢。

activity_game.XML:

enter image description here

SurfaceView我试图从游戏结束后切换:

public class SVGameView extends SurfaceView implements Runnable {
        private SurfaceHolder holder;
    Thread thread = null;
    volatile boolean running = false;
    static final long FPS = 30;
    private Sprite sprite;
    private long lastClick;

    private Bitmap ball, gameOver;
    //private int x = 200, y = 200;
    private int scorePosX = 100;
    private int scorePosY = 100;
    private int countScore = 0;
    private int life = 1;

    public SVGameView(Context context) {
        super(context);
        thread = new Thread(this);
        holder = getHolder();
        holder.addCallback(new SurfaceHolder.Callback() {

            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {
                boolean retry = true;
                running = false;
                while (retry) {
                    try {
                        thread.join();
                        retry = false;
                    } catch (InterruptedException e) {
                    }
                }
            }

            @Override
            public void surfaceCreated(SurfaceHolder holder) {
                running = true;
                thread.start();
            }

            @Override
            public void surfaceChanged(SurfaceHolder holder, int format,
                                       int width, int height) {
            }
        });

        ball = BitmapFactory.decodeResource(getResources(), R.drawable.ball2);
        gameOver = BitmapFactory.decodeResource(getResources(),R.drawable.endscreen);
        sprite = new Sprite(this, ball);
    }

    @Override
    public void run() {
        long ticksPS = 1000 / FPS;
        long startTime;
        long sleepTime;

        while (running) {
            Canvas c = null;
            startTime = System.currentTimeMillis();
            try {
                c = getHolder().lockCanvas();
                synchronized (getHolder()) {
                    update();
                    draw(c);
                }
            } finally {
                if (c != null) {
                    getHolder().unlockCanvasAndPost(c);
                }
            }
            sleepTime = ticksPS-(System.currentTimeMillis() - startTime);
            try {
                if (sleepTime > 0)
                    thread.sleep(sleepTime);
                else
                    thread.sleep(10);
            } catch (Exception e) {}

        }
    }

    private void update(){
        sprite.update();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawColor(Color.WHITE);
        Paint paint = new Paint();
        canvas.drawPaint(paint);
        paint.setColor(Color.WHITE);
        paint.setTextSize(48);
        canvas.drawText("Score: " + countScore, scorePosX, scorePosY, paint);
        canvas.drawText("Lives: " + life, 500, 100, paint);
        sprite.onDraw(canvas);

        //Crashes here
        if(life == 0) {
            getContext().startActivity(new Intent(getContext(), SVGameOver.class));
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        if(System.currentTimeMillis()-lastClick > 300){
            lastClick = System.currentTimeMillis();
        }

        synchronized (getHolder()){
            if(sprite.isHit(event.getX(), event.getY())){
                countScore += 1;
                sprite.increase();
            }else{
                life --;
            }
        }
        return super.onTouchEvent(event);
    }
}

一旦游戏结束我想要达到的活动:

public class SVGameOver extends Activity {

    private Bitmap gameOverScreen;

    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_game);

        gameOverScreen = BitmapFactory.decodeResource(getResources(), R.drawable.endscreen);
    }

    protected void onDraw(Canvas canvas){
        canvas.drawBitmap(gameOverScreen, 0,0,null);
    }
}

2 个答案:

答案 0 :(得分:1)

我认为logcat正在问你一个正确的问题:“你在AndroidManifest.xml中声明了这个活动吗?”

如果您认为自己这样做了,很可能是以错误的方式做到了,大多数情况下您认为自己在清单中添加了一个活动,但是您正在接受这种崩溃,99.9%的你用错误的命名空间声明它的时间

答案 1 :(得分:0)

在AndroidManifest.xml中声明SVGameOver活动:

<activity
    android:name="com.example.welcome.assignment2.SVGameOver">
    ...
</activity>