0

我是 android-development 的初学者,所以请多多包涵。

这是我编写一个简单的“打地鼠”游戏的可悲尝试。UI 由 9 个没有标题的按钮组成。计时器随机选择用户必须单击的按钮之一(按钮获得标题“X”)。如果用户选择了正确的按钮,他将获得 10 分。如果没有及时点击按钮(或错误的按钮),将从分数中扣除 10 分。

如您所见,我为每个按钮添加了一个 OnClickListener,并在 onCreate-Method 中删除了其初始标题(“Button1”、“Button2”...)。一切看起来都很好,直到我离开应用程序然后再回来。所有按钮突然又有了它们的初始标题。计时器仍在运行(分数每秒减少),但所有按钮都不再更改。

现在我知道这可能与活动生命周期有关,并且我已经阅读过它。不幸的是,我的英语不是最好的,我在理解这个概念时遇到了一些麻烦。也许有人愿意简单地向我解释一下?

public class MainActivity extends Activity {

private static int[]        buttons     = {R.id.button1, R.id.button2, ...};
private static List<Button> buttonlist  = new ArrayList<Button>();

private static TextView     scoreboard;
private static Timer        timer = new Timer();
private static int          score;

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

    scoreboard = (TextView) findViewById(R.id.textView1);

    for (int i = 0; i < 9; i++) {
        buttonlist.add((Button) findViewById(buttons[i]));
        buttonlist.get(i).setText("");

        // add OnClickListener for each Button
        ((Button) buttonlist.get(i)).setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                //if correct Button is pressed add 20 to score 
                if ("X".equals(((Button) v).getText().toString())) {
                    score += 20;
                    //and set button-text to "" again ...
                    ((Button) v).setText("");
                }
                else {
                    score -= 10;
                }
            }
        });

    }
    // Start Game
    timer.schedule(new MyTimerTask(), 0, 1000);
}

private class MyTimerTask extends TimerTask {
    @Override
    public void run() {
        runOnUiThread(new Runnable() {
            public void run() {
                score -= 10;
                scoreboard.setText("Your Score: " + score);

                //clear buttons
                for (int i = 0; i < 9; i++)
                    buttonlist.get(i).setText("");

                //pick random button as next target
                buttonlist.get((int) (Math.random() * (9 - 1) + 1)).setText("X");
            }
        });
    }
}



@Override
protected void onResume() {
    super.onResume();
    // Do something here?
}


...
4

1 回答 1

1

一旦您离开您的活动,系统将在您的活动中调用以下方法:

onPause onStop onDestroy

您的活动类实例将被销毁

当您再次输入活动时,它将再次创建,将调用以下方法:

onCreate onStart onResume

这就是您的情况下活动生命周期的样子(还有更多细节)

你的问题是你的 buttonList 是静态的,还有计时器和分数。即使您离开您的应用程序,系统也不会破坏您的应用程序进程,这样所有静态变量都将保持不变。这意味着您的按钮列表最初将包含来自先前活动实例的按钮。

解决方案是不使用静态关键字。如果您想在退出活动后保留某些状态,请查看 onSaveInstanceState。此外 - 假设您的设备可以旋转,这也将重新创建您的活动。

于 2013-01-11T01:19:44.007 回答