按钮不更新其文本

时间:2014-03-24 13:40:45

标签: java android

我正在玩一款安卓游戏。当应用程序启动时,它会显示一个按钮("开始")以启动游戏。当用户输掉时,应用程序应显示原始视图并将按钮文本更改为"重新启动"。当我启动应用程序时一切正常,但当用户输了我得到原始视图(按钮文本没有更改),甚至按钮没有响应。我有两个类: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();

}

当我调试时,我看到执行了更改按钮文本的指令。谢谢你的帮助

2 个答案:

答案 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();
}