2017-08-10 3 views
0

Bonjour J'ai un problème avec le minuteur dans mon jeu-questionnaire. Essentiellement, c'est un jeu à choix multiples et le joueur est chronométré sur chaque question. J'ai le minuteur qui commence quand l'application commence et le joueur voit la première question. Mon problème est que si le joueur répond à la question correctement ou incorrectement, les minuteurs commencent à donner des valeurs aléatoires, même si je réinitialise le minuteur à 30 secondes sur la méthode onclick. Comment faire démarrer la minuterie à 30 secondes et compte à rebours normalement. Merci d'avance :)Numéro de minuterie sur 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

Vous définissez le 'TextView', pas le temporisateur ... –

+0

Utilisez la méthode' equals() 'au lieu de' == 'pour vérifier l'égalité des chaînes – Yupi

Répondre

1

Vous devez définir une variable dans une classe 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(); 


    } 

annulable minuterie

Si vous voulez que votre minuterie résiliables vous devez définir comme une variable globale. Démarrez le temporisateur en appelant la méthode runTimer() ci-dessous.

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(); 


    } 

Vous pouvez annuler le temporisateur en appelant la méthode ci-dessous.

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

Espérons que cela aidera

1

La chose est, vous jamais vraiment annulez une minuterie que vous avez lancé. Parallèlement à cela, pour chaque fois que vous avez besoin d'une minuterie - vous en créez un nouveau, ce qui n'est pas essentiel. Les éléments suivants doivent résoudre votre problème:

Vous devez stocker CountDownTimer dans un champ de classe:

private CountDownTimer timer; 

Ensuite, vous pouvez créer une fois sur le début de l'application:

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

fonction CreateTimer:

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

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

}

Ainsi, lorsque vous devez exécuter minuterie vous suffit d'appeler:

timer.start(); 

Et lorsque l'utilisateur donne une réponse, vous devez annuler la minuterie, puis redémarrez-le:

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

aussi: vous avez du code dupliqué dans votre méthode OnClick(). Indépendamment de l'exactitude des réponses de l'utilisateur, vous devez exécuter la minuterie et définir une valeur à mtimerTextView, donc, fondamentalement, vous voulez le faire en dehors de if-else construction.