2015-02-20 5 views
1

У меня есть таймер обратного отсчета, у меня есть кнопка, которая приостанавливает ее, но мне нужно, когда вы нажимаете на кнопку, продолжайте обратный отсчет. Я искал, но не мог связать эту функцию. Как это можно сделать? Это мой код, я только удалось перезапустить его, но не продолжать:Продолжить таймер обратного отсчета после паузы

private TextView cuentaRegresiva; 
private Button btnEmpezar; 
private CountDownTimer countDownTimer; 
private boolean timerHasStarted = false; 
private long startTime = 30 * 1000; 
private final long interval = 1 * 1000; 
private long restante; 



@Override 
protected void onCreate(Bundle savedInstanceState) { 
... 

btnEmpezar.setOnClickListener(iniciar); 

} 

OnClickListener iniciar=new OnClickListener() { 

    @Override 
    public void onClick(View arg0) { 
     if (!timerHasStarted && !pausado) { 
       countDownTimer.start(); 
       timerHasStarted = true; 
       btnEmpezar.setText("Pause"); 
       pausado=false; 
       } 
     else if(timerHasStarted && !pausado){ 
       countDownTimer.cancel(); 
       timerHasStarted = false; 
       btnEmpezar.setText("Restart"); 
       pausado=true; 
       } 
     else if(!timerHasStarted && pausado){ 
      countDownTimer2.start(); 
      timerHasStarted = true; 
      btnEmpezar.setText("Pause"); 
      pausado=false; 
     } 
    } 
}; 

public class MyCountDownTimer extends CountDownTimer { 
     public MyCountDownTimer(long startTime, long interval) { 
     super(startTime, interval); 

     } 

     @Override 
     public void onFinish() { 
      cuentaRegresiva.setText("Tiempo!"); 
     } 

     @Override 
     public void onTick(long millisUntilFinished) { 
      cuentaRegresiva.setText("" + millisUntilFinished/1000); 
     } 
    } 

public class MyCountDownTimer2 extends CountDownTimer { 
      public MyCountDownTimer2(long restante, long interval) { 
      super(restante, interval); 

      } 

      @Override 
      public void onFinish() { 
       cuentaRegresiva.setText("Tiempo!"); 
      } 

      @Override 
      public void onTick(long millisUntilFinished) { 
       cuentaRegresiva.setText("" + millisUntilFinished/1000); 

      } 
     } 

Я думал о принятии millisUntilFinished переменной, но не работает. В любом случае, я думаю, что путь близок к этому.

+0

документация не слишком ясно, можно ли использовать _start() _ после _cancel() _ снова. Я предполагаю, что это не сработает. Хотя то, что вы могли бы попробовать, это хранить значение _millisUntilFinished_ во время работы таймера. Затем нужно перезапустить таймер, создать новый объект таймера и использовать это значение как продолжительность. – harism

+0

Простой отмена и снова запустить таймер с последнего обратного отсчета или передать состояние паузы таймера классу таймера и продолжать проверять это на timertask и просто пропустить обновление. Когда возобновляется сброс состояния. –

ответ

3

Вы можете попробовать сохранить секунды до окончания, а затем вы можете запустить новый таймер обратного отсчета с этими секундами.

// -----------------------

Cuando presionas эль Ботоном де Pausa, Guarda лос segundos дие ле faltan аль таймер пункт дие Termine. Entonces, cuando volves a adretar play, creas un nuevo CountDownTimer con esos segundos que te faltaban.

UPDATE

Я сделал пример:

public class MainActivity extends Activity { 
    private static final int TIMER_TIME = 10000; // in millis 
    private Button btnCountdown; 
    private TextView tvTimeUntilFinish; 
    private boolean mIsPaused = true; 
    private long mMillisUntilFinish; 
    private CountDownTimer mTimer; 

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

     mMillisUntilFinish = TIMER_TIME; 

     btnCountdown = (Button) findViewById(R.id.btnCountdown); 
     tvTimeUntilFinish = (TextView) findViewById(R.id.tvTimeUntilFinish); 

     btnCountdown.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View arg0) { 
       if (mIsPaused) { 
        btnCountdown.setText("Pause"); 
        initTimer(); 
       } else { 
        btnCountdown.setText("Play"); 
        cancelTimer(); 
       } 

       mIsPaused = !mIsPaused; 
      } 
     }); 
    } 

    private void cancelTimer() { 

     if (mTimer != null) { 
      mTimer.cancel(); 
      mTimer = null; 
     } 

    } 

    private void initTimer() { 
     mTimer = new CountDownTimer(mMillisUntilFinish, 1000) { 
      public void onTick(long millisUntilFinished) { 
       tvTimeUntilFinish.setText("seconds remaining: " + millisUntilFinished/1000); 
       mMillisUntilFinish = millisUntilFinished; 
      } 

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

    } 
} 
+0

Спасибо, Сани. Там я редактировал код, но я не могу заставить его работать правильно. Когда я перезагружаюсь, он вытащил ошибку. Gracias Sany. Ahí edité el código probando lo que me decis, estoy guardando los segundos restantes en la variable "restante", pero cuando lo reanudo vuelve tirar error. Por otro lado podrías pasarme tu e-mail o algún contacto ya que tengo muy pocos conocidos programadores que hablen español, para compartir conocimientos e идеи. Gracias! –

+1

Большое спасибо Sany, он отлично работает! :) –