膨胀布局NullPointerException

时间:2015-03-08 19:14:45

标签: java android

我希望在玩家死亡时进行布局(游戏超过布局)。 我试过这样的话:

View GameOverDialog;

LayoutInflater myInflater = (LayoutInflater)getApplicationContext().getSystemService(getApplicationContext().LAYOUT_INFLATER_SERVICE);
GameOverDialog = myInflater.inflate(R.layout.lose, null, false);
rlGame.addView(GameOverDialog);
GameOverDialog.setVisibility(View.GONE);

当玩家死亡时:

private void lose(){
    GameOverDialog.setVisibility(View.VISIBLE);
}

我也使用Handler,这样我就可以在玩家死亡时发送消息:

final static int DEATH = 0, LOSE = 1;

final Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        if (msg.what == DEATH) {
            //play music
            postDelayed(new Runnable() {
                @Override
                public void run() {
                    Message msg = handler.obtainMessage();
                    msg.what = LOSE;
                    handler.sendMessage(msg);
                }
            }, 1000);
        }
        if (msg.what == LOSE) {
            lose();
        }
        super.handleMessage(msg);
    }
};

但是当Handler调用lose()方法时,应用程序崩溃并且我得到一个NullPointerException。 我希望有人可以帮助我:)。

提前致谢!
Joeri。

修改

全班:

public class Game extends Activity {

final static int DEATH = 0, LOSE = 1;
RelativeLayout rlGame;
GamePanel game_panel;
private int ScreenWidth, ScreenHeight;
View GameOverDialog;
ImageView retry, quit;
TextView textRetry, textQuit;

final Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        if (msg.what == DEATH) {
            //play music
            postDelayed(new Runnable() {
                @Override
                public void run() {
                    Message msg = handler.obtainMessage();
                    msg.what = LOSE;
                    handler.sendMessage(msg);
                }
            }, 1000);
        }
        if (msg.what == LOSE) {
            lose();
        }
        super.handleMessage(msg);
    }
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.game);

    rlGame = (RelativeLayout) findViewById(R.id.rlGame);
    DisplayMetrics dm = new DisplayMetrics();
    this.getWindowManager().getDefaultDisplay().getMetrics(dm);

    final int height = dm.heightPixels;
    final int width = dm.widthPixels;

    game_panel = new GamePanel(getApplicationContext(), width, height, rlGame);
    rlGame.addView(game_panel);

    LayoutInflater myInflater = (LayoutInflater)getApplicationContext().getSystemService(getApplicationContext().LAYOUT_INFLATER_SERVICE);
    GameOverDialog = myInflater.inflate(R.layout.lose, null, false);
    rlGame.addView(GameOverDialog);
    retry = (ImageView) GameOverDialog.findViewById(R.id.retry);
    retry.setOnTouchListener(new TouchButton(retry, textRetry));
    quit = (ImageView) GameOverDialog.findViewById(R.id.quit);
    quit.setOnTouchListener(new TouchButton(quit, textQuit));
    textRetry = (TextView)GameOverDialog.findViewById(R.id.textRetry);
    textQuit = (TextView)GameOverDialog.findViewById(R.id.textQuit);
    GameOverDialog.setVisibility(View.GONE);
}

@Override
public void onBackPressed() {
}

@Override
protected void onStop() {
    super.onStop();
}

private void lose() {
    GameOverDialog.setVisibility(View.VISIBLE);
}

}

我也尝试在onBackPressed方法中设置VISIBLE的可见性,这个工作,我不知道为什么,但是在处理程序中出错了我想...

1 个答案:

答案 0 :(得分:1)

当您不必使用时,请避免使用getApplicationContext()

game_panel = new GamePanel(this, width, height, rlGame);
rlGame.addView(game_panel);

LayoutInflater myInflater = (LayoutInflater)
        getSystemService(Context.LAYOUT_INFLATER_SERVICE);

修改

根据您的评论(下次,请更新您的问题),似乎在设置变量的onCreate之前调用handleMessage。所以在初始化字段后设置你的监听器:

Handler handler;

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...
    // Init field
    GameOverDialog = myInflater.inflate(R.layout.lose, null, false);
    // Set the handler
    handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            if (msg.what == DEATH) {
                //play music
                postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        Message msg = handler.obtainMessage();
                        msg.what = LOSE;
                        handler.sendMessage(msg);
                    }
                }, 1000);
            }
            if (msg.what == LOSE) {
                lose();
            }
            super.handleMessage(msg);
        }
    };
    ...
}