2013-01-11 91 views
0

我是一个总的初学者,因此请在这个问题上与我相处。Android应用程序在恢复后丢失/改变状态

这是我写一个简单的“捶鼹鼠”游戏的悲伤尝试。用户界面由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? 
} 


... 

回答

1

一旦你离开你的活动,系统会调用按照您的活动方法:

的onPause 的onStop 的onDestroy

当你进入

您的活动类的实例将被销毁

您再次将其重新创建,以下方法将被调用:

的onCreate 在onStart 的onResume

这是活动的生命周期看起来像你的情况(有一点了解详情)

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

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

+0

感谢您的快速回复!我现在看起来更清楚:) – subarachnid

相关问题