2017-01-01 5 views
1

私はメモリゲームの小さなアプリを作成しました。そのアプリでは、ユーザーがゲームを終了するまでの時間を示すタイマーを作成しました。私の問題は、別のページ(ホームスクリーンのようなもの)に行ってゲームに戻った後にタイマーがフリーズすることです。時間は停止していたのと同じ時間に残ります。(私はそれを何とかonRestarte()メソッドしかし、何をすべきか分からない..)私はタイマーが停止されたのと同時に続けることを望む。 (ユーザーがゲームの途中でインコールをしてから続けたい場合など)。onRestart状態から復帰したときにアプリでタイマーを続ける方法

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

あなたのコードを編集しました。これを試してみてください

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

ありがとうございます。私は論理を知っています。私はアンドロイドシンタクスでそれを書く方法を知りません。 –

関連する問題