2017-08-10 58 views
0

您好,我在測驗遊戲中遇到計時器問題。本質上它是一個多選題遊戲,玩家在每個問題上計時。我有計時器從應用程序啓動時開始,玩家看到第一個問題。我的問題是,如果玩家正確回答問題或錯誤地定時器開始給予隨機值,即使我重置計時器到onclick方法30秒。如何讓計時器在30秒開始正常倒計時。在此先感謝:)Andriod Studio上的計時器問題

public class MainActivity extends AppCompatActivity { 

    //Views 
    TextView questionTextView; 
    TextView mscoreTextView; 
    TextView mtimerTextView; 
    Button mchoice1; 
    Button mchoice2; 
    Button mchoice3; 
    Button mchoice4; 


    //Constructors 
    private questions Question = new questions(); 
    private Answers cAnswers = new Answers(); 
    private choices Choices = new choices(); 

    //Variables 
    private int questionNumber = 0; 
    private int mScore = 0; 
    private String correctAnswer; 


    public void onClick(View view) { 

     Button answer1 = (Button) view; 

     if(answer1.getText() == correctAnswer) { 

      mScore = mScore + 1; 
      Toast.makeText(getApplicationContext(), "CORRECT!!", Toast.LENGTH_SHORT).show(); 
      mtimerTextView.setText("30s"); 
      runTimer(); 

     } else { 

      Toast.makeText(getApplicationContext(), "WRONG!!", Toast.LENGTH_SHORT).show(); 
      mtimerTextView.setText("30s"); 
      runTimer(); 

     } 

     updateScore(mScore); 
     updateUI(); 
    } 


    private void updateScore(int points) { 

     mscoreTextView.setText("" + points + "/" + Question.getLength()); 
    } 


    public void runTimer() { 

     new CountDownTimer(30100, 1000) { 

      @Override 
      public void onTick(long millisUntilFinished) { 

       String tick = String.valueOf(millisUntilFinished/1000 + "s"); 
       mtimerTextView.setText(tick); 
      } 

      @Override 
      public void onFinish() { 

       Toast.makeText(getApplicationContext(), "TIME RAN OUT!!", Toast.LENGTH_LONG).show(); 
       mtimerTextView.setText("0s"); 
       updateUI(); 
      } 
     }.start(); 


    } 


    private void updateUI() { 

     if (questionNumber < Question.getLength()) { 
      questionTextView.setText(Question.getQuestion(questionNumber)); 
      mchoice1.setText(Choices.getChoices(questionNumber, 1)); 
      mchoice2.setText(Choices.getChoices(questionNumber, 2)); 
      mchoice3.setText(Choices.getChoices(questionNumber, 3)); 
      mchoice4.setText(Choices.getChoices(questionNumber, 4)); 
      correctAnswer = cAnswers.getAnswer(questionNumber); 

      questionNumber ++; 

     } else { 


      Toast.makeText(getApplicationContext(), "This is the last question", Toast.LENGTH_LONG).show(); 
      //Intent intent = new Intent(MainActivity.this, HighScoreActivity.class); 
      //intent.putExtra("Score", mScore); 
      //startActivity(intent); 


     } 

     runTimer(); 
    } 

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

     questionTextView = (TextView) findViewById(R.id.questionTextView); 
     mchoice1 = (Button) findViewById(R.id.choice1); 
     mchoice2 = (Button) findViewById(R.id.choice2); 
     mchoice3 = (Button) findViewById(R.id.choice3); 
     mchoice4 = (Button) findViewById(R.id.choice4); 


     mtimerTextView = (TextView) findViewById(R.id.timerTextView); 
     mscoreTextView = (TextView) findViewById(R.id.scoreTextView); 

     updateScore(mScore); 
     updateUI(); 
    } 
} 
+0

您設置了'TextView',而不是定時器... –

+0

使用equals()方法而不是== ==檢查字符串是否相等 – Yupi

回答

1

您必須在CountDownTimer類中定義一個變量。

public void runTimer() { 

     new CountDownTimer(30100, 1000) { 
     private int time = 30; 

      @Override 
      public void onTick(long millisUntilFinished) { 
       mtimerTextView.setText(time--+"s"); 
      } 

      @Override 
      public void onFinish() { 

       Toast.makeText(getApplicationContext(), "TIME RAN OUT!!", Toast.LENGTH_LONG).show(); 
       mtimerTextView.setText("0s"); 
       updateUI(); 
      } 
     }.start(); 


    } 

可取消定時器

如果你希望你的計時器取消,你必須把它定義爲一個全局變量。

private CountDownTimer timer; // global variable 

通過調用下面的runTimer()方法啓動計時器。

public void runTimer() { 

    timer = new CountDownTimer(30100, 1000) { 
     private int time = 30; 

      @Override 
      public void onTick(long millisUntilFinished) { 
       mtimerTextView.setText(time--+"s"); 
      } 

      @Override 
      public void onFinish() { 

       Toast.makeText(getApplicationContext(), "TIME RAN OUT!!", Toast.LENGTH_LONG).show(); 
       mtimerTextView.setText("0s"); 
       updateUI(); 
      } 
     }.start(); 


    } 

您可以通過調用下面的方法來取消定時器。

public void stopTimer(){ 
    if(timer != null){ 
    timer.cancel(); 
    } 
} 

希望這將有助於

1

的事情是,你從來沒有真正取消你啓動一個定時器。隨着這一點,每次你需要一個計時器 - 你創建一個新的,這是不必要的。以下必須解決您的問題:

您需要存儲CountDownTimer類中的字段:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
    ... 
    timer = createTimer(); 
    ... 
} 

CreateTimer功能:

private CountDownTimer timer; 

然後你可以再上應用的開始創建它:

public void createTimer() { 
    timer = new CountDownTimer(30100, 1000) { 

     @Override 
     public void onTick(long millisUntilFinished) { 
      ... 
     } 
     @Override 
     public void onFinish() { 
      ... 
     } 
} 

}

所以,當你需要運行計時器您只要致電:

timer.start(); 

當用戶給出了一個答案,你需要先取消計時器,然後重新啓動:

public void onClick(View view) { 
    ... 
    timer.cancel(); 
    timer.start(); 
    ... 
} 

另外:你有一些重複的代碼在你的OnClick()方法中。無論用戶的答案是否正確,您都需要運行計時器並將值設置爲mtimerTextView,因此基本上您希望在if-else構建之外執行此操作。