2017-01-01 56 views
1

我創建了一個小型應用程序的記憶遊戲。在那個應用程序中,我創建了一個計時器,顯示用戶完成遊戲的時間。我的問題是定時器凍結後,我去到另一個頁面(如主屏幕),並回到遊戲 - 時間保持在同一時間停止.....(我知道它與某種方式相關onRestarte()方法但不知道該怎麼辦..)我希望計時器將在它停止的同時繼續。 (例如,如果用戶在遊戲中間有入場,然後想繼續)。如何在應用程序中繼續從定時狀態返回計時器

package com.example.kineret.memorygame; 



    public class Game4x4Activity extends AppCompatActivity implements  View.OnClickListener{ 

    TextView timerTextView; 
    long startTime = 0; 
    Handler timerHandler = new Handler(); 
    Runnable timerRunnable = new Runnable() { 
     @Override 
     public void run() { 
      long millis = System.currentTimeMillis() - startTime; 
      int seconds = (int) (millis/1000); 
      int minutes = seconds/60; 
      seconds = seconds % 60; 

      timerTextView.setText(String.format("%d:%02d", minutes, seconds)); 
      timerHandler.postDelayed(this, 500); 
     } 
    }; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_game4x4); 
     timerTextView = (TextView) findViewById(R.id.timerTextView4x4); 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     timerHandler.removeCallbacks(timerRunnable); 
    } 


    @Override 
    public void onClick(View view) { 

     if(newGame) { 
      startTime = System.currentTimeMillis(); 
      timerHandler.postDelayed(timerRunnable, 0); 
      newGame = false; 
     } 

     // rest of my code... 

} 
+0

請你能解釋一點點嗎?你想要什麼 ?當用戶去另一個頁面計時器停止。但你希望那個計時器應該停止或不在後臺運行? –

+0

不,我不希望當用戶轉到另一個頁面時計時器將在後臺繼續。我希望當應用程序處於後臺時停止時間,並且會從用戶返回應用程序之前的相同位置繼續。 –

回答

0

我已編輯您的代碼。 plz試試這個

public class Game4x4Activity extends AppCompatActivity implements  View.OnClickListener{ 

    // make a new variable 
    static long elapsedTime = 0; 
    TextView timerTextView; 
    long startTime = 0; 
    Handler timerHandler = new Handler(); 
    Runnable timerRunnable = new Runnable() { 
     @Override 
     public void run() { 
      // change here 
      long millis = (System.currentTimeMillis() - startTime) + elapsedTime; 
      int seconds = (int) (millis/1000); 
      int minutes = seconds/60; 
      seconds = seconds % 60; 

      timerTextView.setText(String.format("%d:%02d", minutes, seconds)); 
      timerHandler.postDelayed(this, 500); 
     } 
    }; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_game4x4); 
     timerTextView = (TextView) findViewById(R.id.timerTextView4x4); 
    } 

    @Override 
    public void onPause() { 
     // change here 
     elapsedTime = elapsedTime + (System.currentTimeMillis() - startTime); 
     timerHandler.removeCallbacks(timerRunnable); 
     super.onPause(); 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     // change here 
     if(!newGame) { 
      startTime = System.currentTimeMillis(); 
      timerHandler.postDelayed(timerRunnable, 0); 
     } 
    } 
+0

非常感謝!有效!! :) –

+0

只是想明白,爲什麼你沒有在「onResume()」的「onRestart()」方法instesd中使用? –

+0

好吧,它沒有完美的工作...現在,當我開始一個新的遊戲,它仍然計算時間與經過的時間.. –

0

如果用戶得到一個電話你的應用程序將調用那麼,如果他們完成他們的電話,玩你的遊戲你的活動將得到onResume調用。

in 保存系統時間,在onResume得到最新的系統時間。將這些東西彼此分開(在onResume中),並且您將有時間讓用戶不在您的應用程序中,然後在重新啓動之前將其添加到您的計時器中。

您可能還需要在其他位置持續使用onSaveInstanceState

+0

非常感謝。我知道邏輯我不知道如何寫在機器人sintax .. –

相關問題