2016-08-30 10 views
3

私は、一時停止して再開する必要のある方法の中でカウントダウンタイマを使用しています。 onPauseで.cancel()を使用してタイマーを一時停止することができましたが、正常に再起動することができません。 私は2つのシナリオを持っています: シナリオ1 - 一時停止しますが、再起動すると、最初のタイマーがキャンセルされても両方のカウントダウンタイマーが再開したようです。アクティビティでCountDownTimerを正しく設定する方法

public void playAgain (View view) { 

     score = 0; 
     numberOfQuestions = 0; 
     timerTextView.setText("60s"); 
     pointsTextView.setText("0/0"); 
     resultTextView.setText(""); 
     playAgainButton.setVisibility(View.INVISIBLE); 
     returnToMenu.setVisibility(View.INVISIBLE); 
     resultDisplayTextView.setVisibility(View.INVISIBLE); 
     countDownText.setVisibility(View.VISIBLE); 
     button0.setVisibility(View.INVISIBLE); 
     button1.setVisibility(View.INVISIBLE); 
     button2.setVisibility(View.INVISIBLE); 
     button3.setVisibility(View.INVISIBLE); 
     sumTextView.setVisibility(View.INVISIBLE); 

      countDownTimer = new CountDownTimer(millisInFuture, countDownInterval) { 
       @Override 
       public void onTick(long timeRemain) { 

        millisInFuture = timeRemain; 

        countDownText.setText(String.valueOf(timeRemain/1000 - 60)); 

        if (timeRemain <= 61000) { 

         timerTextView.setText(String.valueOf(timeRemain/1000) + "s"); 
         button0.setEnabled(true); 
         button1.setEnabled(true); 
         button2.setEnabled(true); 
         button3.setEnabled(true); 
         button0.setVisibility(View.VISIBLE); 
         button1.setVisibility(View.VISIBLE); 
         button2.setVisibility(View.VISIBLE); 
         button3.setVisibility(View.VISIBLE); 
         sumTextView.setVisibility(View.VISIBLE); 
         countDownText.setVisibility(View.INVISIBLE); 
        } 

       } 


       @Override 
       public void onFinish() { 

        timerTextView.setText("0s"); 



        if (score > 0) { 
         percentage = score * 100/numberOfQuestions; 
        } else { 
         percentage = 0; 
        } 

        button0.setEnabled(false); 
        button1.setEnabled(false); 
        button2.setEnabled(false); 
        button3.setEnabled(false); 
        playAgainButton.setVisibility(View.VISIBLE); 
        returnToMenu.setVisibility(View.VISIBLE); 
        resultDisplayTextView.setVisibility(View.VISIBLE); 
        resultTextView.setText(" "); 
    } 
      }.start(); 

     generateQuestion(); 

    } 


@Override 
    public void onPause() { 

     countDownTimer.cancel(); 

     super.onPause(); 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
CountDownTimer countDownTimer1 = new CountDownTimer(millisInFuture, countDownInterval) { 
      @Override 
      public void onTick(long timeRemain) { 

       millisInFuture = timeRemain; 

       countDownText.setText(String.valueOf(timeRemain/1000 - 60)); 

       if (timeRemain <= 61000) { 

        timerTextView.setText(String.valueOf(timeRemain/1000) + "s"); 
        button0.setEnabled(true); 
        button1.setEnabled(true); 
        button2.setEnabled(true); 
        button3.setEnabled(true); 
        button0.setVisibility(View.VISIBLE); 
        button1.setVisibility(View.VISIBLE); 
        button2.setVisibility(View.VISIBLE); 
        button3.setVisibility(View.VISIBLE); 
        sumTextView.setVisibility(View.VISIBLE); 
        countDownText.setVisibility(View.INVISIBLE); 
       } 

      } 


      @Override 
      public void onFinish() { 

       timerTextView.setText("0s"); 



       if (score > 0) { 
        percentage = score * 100/numberOfQuestions; 
       } else { 
        percentage = 0; 
       } 

       button0.setEnabled(false); 
       button1.setEnabled(false); 
       button2.setEnabled(false); 
       button3.setEnabled(false); 
       playAgainButton.setVisibility(View.VISIBLE); 
       returnToMenu.setVisibility(View.VISIBLE); 
       resultDisplayTextView.setVisibility(View.VISIBLE); 
       resultTextView.setText(" "); 
} 
     }.start(); 
} 

2つ目のシナリオは、単にシステムをクラッシュ:

public void playAgain (View view) { 

     score = 0; 
     numberOfQuestions = 0; 
     timerTextView.setText("60s"); 
     pointsTextView.setText("0/0"); 
     resultTextView.setText(""); 
     playAgainButton.setVisibility(View.INVISIBLE); 
     returnToMenu.setVisibility(View.INVISIBLE); 
     resultDisplayTextView.setVisibility(View.INVISIBLE); 
     countDownText.setVisibility(View.VISIBLE); 
     button0.setVisibility(View.INVISIBLE); 
     button1.setVisibility(View.INVISIBLE); 
     button2.setVisibility(View.INVISIBLE); 
     button3.setVisibility(View.INVISIBLE); 
     sumTextView.setVisibility(View.INVISIBLE); 

      countDownTimer = new CountDownTimer(millisInFuture, countDownInterval) { 
       @Override 
       public void onTick(long timeRemain) { 

        millisInFuture = timeRemain; 

        countDownText.setText(String.valueOf(timeRemain/1000 - 60)); 

        if (timeRemain <= 61000) { 

         timerTextView.setText(String.valueOf(timeRemain/1000) + "s"); 
         button0.setEnabled(true); 
         button1.setEnabled(true); 
         button2.setEnabled(true); 
         button3.setEnabled(true); 
         button0.setVisibility(View.VISIBLE); 
         button1.setVisibility(View.VISIBLE); 
         button2.setVisibility(View.VISIBLE); 
         button3.setVisibility(View.VISIBLE); 
         sumTextView.setVisibility(View.VISIBLE); 
         countDownText.setVisibility(View.INVISIBLE); 
        } 

       } 


       @Override 
       public void onFinish() { 

        timerTextView.setText("0s"); 



        if (score > 0) { 
         percentage = score * 100/numberOfQuestions; 
        } else { 
         percentage = 0; 
        } 

        button0.setEnabled(false); 
        button1.setEnabled(false); 
        button2.setEnabled(false); 
        button3.setEnabled(false); 
        playAgainButton.setVisibility(View.VISIBLE); 
        returnToMenu.setVisibility(View.VISIBLE); 
        resultDisplayTextView.setVisibility(View.VISIBLE); 
        resultTextView.setText(" "); 
    } 
      }.start(); 

     generateQuestion(); 

    } 


@Override 
    public void onPause() { 

     countDownTimer.cancel(); 

     super.onPause(); 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
countDownTimer.start(); 
} 

私はGoogleで検索しているとワーキング解決策を見つけるように見えることはできません。 ギャラクシーストアは、この機能が動作しない限り、私のAPKのアップロードを拒否します。

答えて

2

事実、CountDownTimerは比較的限られたクラスです。 start()cancel()の2つのメソッドと、2つのコールバック、onTick()onFinish()の2つのメソッドしかありません。

私は、CountDownTimerの動作を視覚化するためにTextViewで非常に基本的なアクティビティを設定しました。あなたが望むように動作しています。アクティビティを終了するときに一時停止し、戻ったときに再開します。私はあなたが実行するには、このコードを取得することができるかどうかをチェックして起動し、プロジェクトに基本的な考え方を統合したい

import android.os.CountDownTimer; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.widget.TextView; 

import java.util.Locale; 

public class MainActivity extends AppCompatActivity { 

    private TextView mTextView; 
    private CountDownTimer mCountDownTimer; 

    private static final long INTERVAL = 1000L; 
    private long timeRemaining = 60000L; 

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

     mTextView = (TextView)findViewById(R.id.text_view); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 

     mCountDownTimer = new CountDownTimer(timeRemaining, INTERVAL) { 
      @Override 
      public void onTick(long l) { 
       mTextView.setText(String.format(Locale.getDefault(), "%d sec.", l/1000L)); 
       timeRemaining = l; 
      } 

      @Override 
      public void onFinish() { 
       mTextView.setText("Done."); 
      } 
     }; 
     mCountDownTimer.start(); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     mCountDownTimer.cancel(); 
    } 
} 

:私はここで簡単なコードを掲載しました。基本的には、CountDownTimerオブジェクトの外に残っている時間を維持する必要があります。

+0

これはうまくいきましたが、timeRemaining変数に問題が発生しました。これは、playAgainが押されたときに60000にリセットされるはずです。私はplayAgainメソッドでそれをリセットしようとしましたが、動作していません。私は再開時にそれをリセットしたが、残りの時間の代わりに60秒のマークで再開する。たびに私は今playAgain timeRemain = lの位置から始まります。 –

+0

私はさらにonFinnishでそれをリセットしようとしました –

+0

私はtimeRemainを呼び出すメソッドを作成しようとしました –

関連する問題