2014-02-21 3 views
-2

Итак, когда мой секундомер остановлен, он показывает время его остановки, но когда кнопка запуска снова нажата, он возобновляет время до 0:00:00, как я могу возобновить его с время остановилось? Вот весь код, если это необходимоВозобновление секундомера после остановки

package com.webdeveloper93.stopwatch; 

import java.util.ArrayList; 
import java.util.List; 
import java.util.Random; 
import java.util.Timer; 

import android.os.Bundle; 
import android.os.Handler; 
import android.annotation.SuppressLint; 
import android.app.Activity; 
import android.util.Log; 
import android.view.Menu; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.RelativeLayout; 
import android.widget.TextView; 

public class StopWatch extends Activity implements OnClickListener { 

    private long startTime; 
    private long endTime; 
    private Random rand = new Random(); 
    private boolean timerIsRunning; 
    private String savedTime; 
    private TextView stopWatchC; 
    private Button startButton,stopButton,pauseButton; 
    private RelativeLayout mainLayout; 
    private Handler handle; 
    private Handler backHand = new Handler(); 
    private boolean paused; 
    private long UPDATE_EVERY = 200; 
    private int backgrounds[] = {R.drawable.woman_1,R.drawable.woman_2,R.drawable.woman_3,R.drawable.woman_4}; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.stopwatch); 
     stopWatchC = (TextView) findViewById(R.id.counter); 
     startButton = (Button) findViewById(R.id.start_button); 
     stopButton = (Button) findViewById(R.id.stop_button); 
     pauseButton = (Button) findViewById(R.id.pause); 
     mainLayout = (RelativeLayout) findViewById(R.id.main_layout); 
     //ONCLICK HANDLERS 
     startButton.setOnClickListener(this); 
     stopButton.setOnClickListener(this); 
     pauseButton.setOnClickListener(this); 
     backHand.postDelayed(backgroundUpdate, 300); 

    } 
    /** 
    * Handles displaying the counter 
    */ 
    public void SWCounterDisplay() 
    { 
    String display; 
    long now; 
    long difference; 
    long secs; 
    long mins; 
    long hours; 

    if(timerIsRunning == true) 
    { 
     now = System.currentTimeMillis(); 
    }else{ 
     now = endTime; 
    } 

    difference = now-startTime; 
    //No negative numbers 
    if(difference < 0) 
    { 
     difference = 0; 
    } 

    secs = difference/1000; 
    mins = secs/60; 
    hours = mins/60; 
    secs = secs%60; 
    mins = mins%60; 

    display = String.format("%d", hours) + ":" + 
       String.format("%02d",mins) + ":" + 
       String.format("%02d", secs); 


    stopWatchC.setText(display); 

    } 
    public void pauseTimer() 
    { 
     timerIsRunning = false; 
     endTime = System.currentTimeMillis(); 
     startButton.setEnabled(true); 
    } 
    /** 
    * Starts the stop watch 
    */ 
    public void startTimer() 
    { 
     timerIsRunning = true; 
     stopButton.setEnabled(timerIsRunning); 
     startButton.setEnabled(false); 
     startTime = System.currentTimeMillis(); 
     //Create new handler 
     handle = new Handler(); 
     handle.postDelayed(timerUpdate, UPDATE_EVERY); 

    } 
    /** 
    * Stops the timer 
    */ 
    public void stopTimer() 
    { 
     timerIsRunning = false; 
     stopButton.setEnabled(timerIsRunning); 
     startButton.setEnabled(true); 
     endTime = System.currentTimeMillis(); 
     handle.removeCallbacks(timerUpdate); 
     handle = null; 
    } 
    /** 
    * Handles any onclick events 
    */ 
    @Override 
    public void onClick(View v) { 

     if(v == startButton) 
     { 
      startTimer(); 
     }else if(v == stopButton) 
     { 
      stopTimer(); 
     }else if(v == pauseButton) 
     { 
      pauseTimer(); 
     } 
    } 


    private Runnable backgroundUpdate = new Runnable(){ 

     @Override 
     public void run() { 
      mainLayout.setBackgroundResource(backgrounds[rand.nextInt(backgrounds.length)]); 
      backHand.postDelayed(this, 20000); 
     } 

    }; 
    /** 
    * Handles updating the timer 
    */ 
    private Runnable timerUpdate = new Runnable(){ 

     @Override 
     public void run() { 
      SWCounterDisplay(); 
      if(handle != null){ 
       //Log.d("Run Method","RUN METHOD IS RUNNING"); 
      handle.postDelayed(this, UPDATE_EVERY); 
      } 

     } 

    }; 
    /** 
    * Call run method if timer is still running 
    */ 
    public void onStart() 
    { 
     super.onStart(); 
     if(timerIsRunning == true) 
     { 
      handle = new Handler(); 
      handle.postDelayed(timerUpdate, UPDATE_EVERY); 
     } 
    } 
    /** 
    * Stop the timer if timer is still running 
    */ 
    public void onStop() 
    { 
     super.onStop(); 
     if(timerIsRunning == true) 
     { 
      handle.removeCallbacks(timerUpdate); 
      handle = null; 
     } 
    } 
    /** 
    * Resume when the onResume method is called 
    */ 
    public void onResume() 
    { 
     super.onResume(); 
     stopButton.setEnabled(false); 
     startButton.setEnabled(true); 
     SWCounterDisplay(); 
    } 

} 

ответ

0

Проблема заключается вы сбросе startTime в методе startTimer

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

Это собирается потребовать от вас, чтобы добавить опцию сброса на отдых «был запущен до» флаг

Например ...

public void startTimer() 
{ 
    timerIsRunning = true; 
    stopButton.setEnabled(timerIsRunning); 
    startButton.setEnabled(false); 
    if (!previouslyStarted) { 
     previouslyStarted = true; 
     startTime = System.currentTimeMillis(); 
    } 
    //Create new handler 
    handle = new Handler(); 
    handle.postDelayed(timerUpdate, UPDATE_EVERY); 

} 

public void resetTimer() { 
    previouslyStarted = false; 
    // reset the time values and output as you want... 
} 

Обновлено

Я не проверял это, поэтому вам может понадобиться его настроить, но в основном вам нужно поддерживать какое-то «значение времени выполнения», которое может быть включено в ваши расчеты между событиями запуска, остановки и сброса ...

public void startTimer() { 
    timerIsRunning = true; 
    stopButton.setEnabled(timerIsRunning); 
    startButton.setEnabled(false); 

    if (!previouslyStarted) { 
     runTime = 0; 
     previouslyStarted = true; 
    } 

    startTime = System.currentTimeMillis(); 
    //Create new handler 
    handle = new Handler(); 
    handle.postDelayed(timerUpdate, UPDATE_EVERY); 

} 

public void stopTimer() { 
    timerIsRunning = false; 
    stopButton.setEnabled(timerIsRunning); 
    startButton.setEnabled(true); 
    endTime = System.currentTimeMillis(); 

    runTime += endTime - startTime; 

    handle.removeCallbacks(timerUpdate); 
    handle = null; 
} 

public void resetTimer() { 
    previouslyStarted = false; 
    // reset the time values and output as you want... 
} 

И в методе SWCounterDisplay, вам нужно будет включить это в ваших calcualtions, к примеру ...

difference = runTime + (now - startTime); 
+0

Хорошо это решение работает на полпути, однако, когда я действительно возобновить его, как его все еще рассчитывает в фон во время паузы. В зависимости от того, как долго он приостанавливается, он заканчивает добавление нескольких секунд, минут и т. Д. К таймеру, когда я возобновляю – user3325917

+0

Хорошо ... вместо того, чтобы полагаться только на время начала/окончания, вам также нужно будет поддерживать дополнительное значение, который является «временем выполнения». Поэтому каждый раз, когда вы приостанавливаете/возобновляете секундомер, вам нужно сбросить время «startTime» и добавить результирующее значение в «время выполнения», поэтому «время выполнения» станет основанием для ваших вычислений ... – MadProgrammer

+0

Can пожалуйста, дайте мне пример? Im визуальный человек, поэтому его легче понять на примере. Еще раз спасибо за помощь – user3325917

Смежные вопросы