我自己写了个GameView,然后在Avtivity里面setContentView(gameView),在GameView那边的run方法中将游戏结束信息传递给Activity,然后Activity用setContentView(R.···)换布局,我试过了,可以把消息传过来,但是执行setContentView(R.···)会报空引用的错误,现在就是要当GameView那边游戏结束时候通知Avtivity更换布局,通知传递过来了,但是处理就出错了,请大牛们帮忙看下,Activity里面的代码如下
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  gameView=new GameView(this);
  setContentView(gameView);
  gameOver.post(gameView.MyThread);
}
public Handler gameOver = new Handler() {
  @Override
  public void handleMessage(Message msg) {
   switch (msg.what) {
   case 1:
    System.out.println("gameover```````````````````");//这句话可以打印
    setContentView(R.layout.choose_layout);//就是这里出错了
    break;
   default:
    break;
   }
  }
};
GameView代码如下:Runnable MyThread =new Runnable (){
  public void run() {
   while (flag) {
    canvas = holder.lockCanvas();
                ·
                ·
                ·
                ·
    holder.unlockCanvasAndPost(canvas);
    //GameOver处理
    if (endGame()){
     Message msg = gameViewActivity.gameOver.obtainMessage();
     msg.arg1 = GAME_OVER;//GAME_OVER=1
     gameViewActivity.gameOver.sendMessage(msg);
    }
   }
  }
};

解决方案 »

  1.   

    choose_layout这个XML布局文件有问题,找找看
      

  2.   


    这个没问题的,我在其他Activity里面用了的···就是没问题才用这个在测试···
      

  3.   


    试过了,还是一样,我想是我对Handler理解有点问题,其它线程向主线程发送消息主线程作处理这块有点混了···
      

  4.   

    直接在onCreate内设置setContentView(R.layout.choose_layout)有没试过
      

  5.   

    你这个代码里面,MyThread在主线程里面跑,没有跑什么错误吗?好奇怪
      

  6.   

    你想的应该报什么错啊?我对Handler头疼了,今天对了英文文档看了半天···
      

  7.   

    我觉得应该报anr的错误,就是应用程序不响应的错误
      

  8.   

    GameView可以用View类进行开发啊,重写onDraw方法实现界面显示,再在GameView类里写一个内部类(刷新GameView的线程),在这个线程的run方法里向activity发送消息
    如果是复杂写的游戏的话,用SurfaceView类进行开发更好
      

  9.   

    是不是R文件里面找不到ID【choose_layout】,clean一下
      

  10.   

    换一种方式!不要setContentView了。
      

  11.   

    换种方式:当收到GameView那边游戏结束的通知时,直接拉起另外一个 Activity(choose_layout布局的)试试看