2017-08-09 2 views
0

Je travaille sur une application Android où je voudrais que le CountdownTimer saute 5 secondes lorsque le bouton de réinitialisation est pressé. Par exemple, si le bouton de réinitialisation est enfoncé lorsque le compte à rebours est à t = 15, le chronomètre sautera les cinq secondes suivantes et le chronomètre affichera alors t = 10. Voici ce que j'ai essayé mais cela n'a pas fonctionné:Faire le compte à rebours sauter 5 secondes lorsque le bouton est pressé (studios Android)

code Button:

buttonReset = (Button) findViewById(R.id.ButtonReset); 

    buttonReset.setOnClickListener(
      new OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        TextView output = (TextView) findViewById(R.id.Display); 
        r = 1; 
        output.setText(""); 
        resetStatus = true; 
       } 
      } 
    ); 

Edit: J'ai mis à jour le code de la minuterie. Maintenant, j'annule l'ancienne minuterie et j'en entame une nouvelle.
Compte à rebours code minuterie:

public void start() 
{ 
    new CountDownTimer(59*1000, 1000) 
    { 
     TextView timer = (TextView) findViewById(R.id.Timer); 
     public void onTick(long millisUntilFinished) 
     { 
      int TimeSeconds = (int) millisUntilFinished/1000; 

      if (resetStatus) 
      { 
       cancel(); 

       TimeSeconds = TimeSeconds - 5; 
       final int finalTimeSeconds = TimeSeconds; 

       new CountDownTimer(finalTimeSeconds*1000, 1000) 
       { 
        @Override 
        public void onTick(long millisUntilFinished) { 
         if (finalTimeSeconds >= 10) 
         { 
          //displays time 
          timer.setText("00:" + finalTimeSeconds); 
         } 

         else 
         { 
          //displays time 
          timer.setText("00:0" + finalTimeSeconds); 
         } 
         resetStatus = false; 
        } 

        @Override 
        public void onFinish() { 
         gameOverDialogue(); 

        } 
       }.start(); 
      } 

      else 
      { 
       if (TimeSeconds >= 10) 
       { 
        //displays time 
        timer.setText("00:" + TimeSeconds); 
       } 

       else 
       { 
        //displays time 
        timer.setText("00:0" + TimeSeconds); 
       } 

      } 
     } 
     public void onFinish() 
     { 
      gameOverDialogue(); 
     } 
    }.start(); 
} 

Lorsque j'appuie sur le bouton de remise à zéro maintenant, la minuterie saute 5 secondes, après quoi l'affichage se fige. Cependant, la minuterie continue à cocher et atteint 0. Je pense que c'est parce que dans le deuxième compte à rebours la variable finalfinalTimeSeconds est utilisée au lieu de TimeSeconds. Aucune suggestion?

Merci à l'avance

Répondre

0

Dans votre code, vous ne modifient que, une fois, le temps d'affichage, mais votre CountDownTimer ne sont pas affectés par cette modification.

Vous devez redémarrer un autre CountDownTimer avec le nouveau délai et annuler le délai actuel.

+0

J'ai changé le code dans ma question. J'annule l'ancien minuteur et en démarre un nouveau maintenant mais un autre problème survient que j'ai décrit en bas de la question éditée –

+0

Dans votre code mis à jour, le second CountDownTimer que vous créez ne contient pas le même code que le premier. Vous feriez mieux de créer votre propre sous-classe de CountDownTimer et en créer de nouveaux si nécessaire. L'annulation doit se faire directement dans votre onclick, puis vous en commencez une nouvelle avec l'heure mise à jour. Oubliez votre réinitialisation booléenne. – smora

0

Le problème est que votre affichage change avec votre drapeau, mais pas la minuterie. Votre affectation

int TimeSeconds = (int) millisUntilFinished/1000; 

s'exécute à chaque tick. Vous vérifiez le drapeau resetStatus et ajustez le TextView, mais cela n'a aucun effet sur le minuteur réel. La prochaine fois qu'il se déclenche, il aura le temps (non déduit) approprié restant.

La résolution de ce problème peut être difficile. Vous pouvez, comme suggéré par @MoraS, créer un nouveau CountdownTimer chaque fois qu'une déduction est justifiée. Cette solution fonctionnera, mais si vous prévoyez des déductions souvent, cela peut ralentir un peu l'application. Ma suggestion serait de garder une trace du nombre total de déductions, l'utiliser pour garder TextView à jour, et annuler le minuteur tôt le cas échéant.

+0

J'ai changé le code dans ma question. J'annule l'ancien minuteur et j'en entame un nouveau maintenant mais un autre problème survient que j'ai décrit au bas de la question éditée –

+0

Je ne suis pas sûr de comprendre votre question. Quand vous dites minuterie, faites-vous référence au CountDownTimer ou au minuteur TextView? Si vous parlez du CountDownTimer, comment savez-vous que la minuterie continue de fonctionner? Si vous parlez du TextView, comment se fait-il que votre affichage se fige mais que la minuterie fonctionne toujours? –

+0

CountDownTimer() saute 5 secondes et le temporisateur TextView affiche le temps déduit. Maintenant, la minuterie Textview se fige mais CountDownTimer() continue de compter à partir du temps après déduction si cela a du sens. e.g, dis CountDownTimer est à 55, si j'appuie sur le bouton de réinitialisation, la minuterie TextView affiche 50 et se fige. Cependant, CountDowbTimer continue à compter de 50 à 0 –