我是android开发的初学者,所以请耐心等待。
这是我写一篇简单的“Whack-a-Mole”游戏的悲惨尝试。用户界面由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?
}
...
答案 0 :(得分:1)
离开活动后,系统会在您的活动中调用以下方法:
的onPause 的onStop 的onDestroy
您的活动类实例将被销毁
再次输入活动时,将再次创建活动,将调用以下方法:
的onCreate 在onStart 的onResume
这就是您的案例中活动生命周期的样子(还有更多细节)
你的问题是你的buttonList是静态的,还有计时器和分数。即使您离开应用程序,系统也不会破坏您的应用程序进程,这样所有静态变量都将保持不变。这意味着您的按钮列表将包含来自先前活动实例的初始按钮。
解决方案是不使用static关键字。如果要在退出活动后保留某些状态,请查看onSaveInstanceState。此外 - 假设您的设备可以旋转,这也将重新创建您的活动。