我正在玩一款安卓游戏。当应用程序启动时,它会显示一个按钮("开始")以启动游戏。当用户输掉时,应用程序应显示原始视图并将按钮文本更改为"重新启动"。当我启动应用程序时一切正常,但当用户输了我得到原始视图(按钮文本没有更改),甚至按钮没有响应。我有两个类:GameActivity和GameView: 在GameActivity中我有这个:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
init();
}
public void init() {
setContentView(R.layout.activity_catch_game);
fruitView = (CatchGameView) findViewById(R.id.l3InfoCatchGameView1);
fruitView.setActivity(this);
if (bStart == null) { //When we launch the app
bStart = (Button) findViewById(R.id.start);
bStart.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
buttonStartClickEventHandler();
}
});
} else{
bStart.setText("Restart");
}
}
在GameView中我有这个:
private void showScore() {
stopTimer();
AlertDialog.Builder popupBuilder = new AlertDialog.Builder(
this.getContext());
TextView message = new TextView(this.getContext());
message.setText("Score : " + score);
message.setGravity(Gravity.CENTER_HORIZONTAL);
popupBuilder.setView(message);
popupBuilder.setCancelable(true);
popupBuilder.setNeutralButton("Ok",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
invalidate();
activity.init();
}
});
popupBuilder.show();
}
当我调试时,我看到执行了更改按钮文本的指令。谢谢你的帮助
答案 0 :(得分:2)
问题是您的init()
方法会调用setContentView()
。
执行此操作时,活动的布局会重新膨胀。您对视图的所有引用(例如bstart
)现在都指向布局的旧副本中的视图,现在用户不再可以看到它。
由于bstart
仍在引用某些内容,if (bStart == null)
为false,您没有获得对bstart
的更新引用。
我会将用于更新按钮文本的逻辑与您设置Activity的布局的逻辑分开。
答案 1 :(得分:0)
将setContentView移动到onCreate。因为当你调用activity.init();时,你再次设置视图
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_catch_game);
init();
}