有什么简单的方法可以让计时器暂停然后再次启动时,它会从暂停的时间恢复?
我查看了其他教程,它们仅在按下暂停按钮两次后重新启动计时器。
我是安卓开发的新手,如果这是一个愚蠢的问题,我很抱歉。
public class Timer extends Fragment {
TextView CurrentDate;
TextView CurrentTime;
Thread ThreadTime;
TextView textTimeStarted;
Button buttonReset;
Button buttonPauseStart;
TextView textElapsedTime;
private Button startButton;
private Button pauseButton;
private TextView timerValue;
long timeInMilliseconds = 0L;
long timeSwapBuff = 0L;
long updatedTime = 0L;
long startTime = 0L;
//runs without a timer by reposting this handler at the end of the runnable
Handler timerHandler = new Handler();
Runnable timerRunnable = new Runnable() {
@Override
public void run() {
long millis = System.currentTimeMillis() - startTime;
int millisecs = (int) (millis % 1000);
int seconds = (int) (millis / 1000);
int minutes = seconds / 60;
seconds = seconds % 60;
textElapsedTime.setText(String.format("%d:%02d:%02d", minutes, seconds, millisecs));
timerHandler.postDelayed(this, 0);
}
};
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View T = inflater.inflate(R.layout.time_layout, container, false);
Runnable myRunnableThread = new CountDownRunner();
ThreadTime = new Thread(myRunnableThread);
ThreadTime.start();
ConnecttoXML(T);
buttonReset = (Button) T.findViewById(R.id.buttonStop);
buttonReset.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
timerHandler.removeCallbacks(timerRunnable);
textElapsedTime.setText("");
textTimeStarted.setText("");
}
});
buttonPauseStart = (Button) T.findViewById(R.id.ButtonStart);
buttonPauseStart.setText("Start");
buttonPauseStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
buttonPauseStart = (Button) v;
if (buttonPauseStart.getText().equals("stop")) {
timerHandler.removeCallbacks(timerRunnable);
buttonPauseStart.setText("start");
} else {
startTime = System.currentTimeMillis();
timerHandler.postDelayed(timerRunnable, 0);
Calendar cs = Calendar.getInstance();
System.out.println("Current time => " + cs.getTime());
SimpleDateFormat df = new SimpleDateFormat("HH:mm");
String formattedDate = df.format(cs.getTime());
textTimeStarted.setText(formattedDate);
buttonPauseStart.setText("stop");
}
}
});
return T;
}
private void ConnecttoXML(View view) {
CurrentDate = (TextView) view.findViewById(R.id.textCurrentDate);
textTimeStarted = (TextView) view.findViewById(R.id.textTimeStarted);
textElapsedTime = (TextView) view.findViewById(R.id.textElapsedTime);
String currentDate = DateFormat.getDateInstance().format(Calendar.getInstance().getTime());
CurrentDate.setText(currentDate);
}
public void doWork() {
getActivity().runOnUiThread(new Runnable() {
public void run() {
try {
CurrentTime = (TextView) getActivity().findViewById(R.id.textCurrentTime);
Date dt = new Date();
int hours = dt.getHours();
int minutes = dt.getMinutes();
String curTime = hours + ":" + minutes;
CurrentTime.setText(curTime);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public class CountDownRunner implements Runnable {
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
try {
doWork();
Thread.sleep(1000); // Pause of 1 Second
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} catch (Exception e) {
}
}
}
}
}
不,对于处理程序,您只能设置时间然后取消它,但我看不出这会如何帮助您,因为您正在运行 postDelayat at 0,基本上尽可能快地更新 UI 中的计时器。
如果要暂停计时器,则必须保存经过的时间而不是开始时间,并具有开始/停止和重置按钮。
这是我发现的将暂停添加到计时器的最简单方法:
buttonPauseStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
buttonPauseStart = (Button) v;
if (buttonPauseStart.getText().equals("stop")) {
elapsedTime = System.currentTimeMillis() - startTime;
timerHandler.removeCallbacks(timerRunnable);
buttonPauseStart.setText("start");
} else {
startTime = System.currentTimeMillis() - elapsedTime;
timerHandler.postDelayed(timerRunnable, 0);
Calendar cs = Calendar.getInstance();
System.out.println("Current time => " + cs.getTime());
SimpleDateFormat df = new SimpleDateFormat("HH:mm");
String formattedDate = df.format(cs.getTime());
textTimeStarted.setText(formattedDate);
buttonPauseStart.setText("stop");
}
}
});