So my app has 1 activity and 4 fragments and one of them has Chronometer to show how much time is passed.
It works fine, but I have one issue that the chronometer keeps going back to 00:00 every time I move to another fragment and come back.
I know it is because my startStopWatch() method is in OnCreateView, but is there any way to make it continue from where it stopped?
Is it possible to use Bundle class to solve this? If so, how?
Here is my code for Chronometer, all are in one fragment:
public class FirstFragment extends Fragment {
Chrhonometer chronometer;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final View view = inflater.inflate(R.layout.fragment_memo, container, false);
chronometer = view.findViewById(R.id.stop_watch);
chronometer.setFormat("%s");
chronometer.setBase(SystemClock.elapsedRealtime());
startStopWatch();
}
}
And methods:
private void startStopWatch() {
if (chronometer.getBase() != 0) {
chronometer.setBase(SystemClock.elapsedRealtime());
} else {
chronometer.setBase(chronometer.getBase() + SystemClock.elapsedRealtime());
}
chronometer.start();
}
private void stopStopWatch() {
chronometer.setBase(SystemClock.elapsedRealtime());
chronometer.stop();
}
Thanks in advance.
Try this method
public class FirstFragment extends Fragment {
Chrhonometer chronometer;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final View view = inflater.inflate(R.layout.fragment_memo, container, false);
chronometer = view.findViewById(R.id.stop_watch);
ChronometerHelper chronometerHelper = new ChronometerHelper();
startStopWatch();
}
private void startStopWatch() {
if (chronometerHelper.getStartTime() == null) {
// If the start date is not defined, set it.
long startTime = SystemClock.elapsedRealtime();
chronometerHelper.setStartTime(startTime);
chronometer.setBase(startTime);
} else {
// Otherwise set the chronometer's base to the original
// starting time.
chronometer.setBase(chronometerHelper.getStartTime());
}
chronometer.start();
}
private void stopStopWatch() {
long startTime = SystemClock.elapsedRealtime();
chronometerHelper.setStartTime(startTime);
chronometer.setBase(startTime);
chronometer.stop();
}
}
Create a class ChronometerHelper , in which you will save the starting time.
public class ChronometerHelper {
@Nullable
private static Long mStartTime;
@Nullable
public Long getStartTime() {
return mStartTime;
}
public void setStartTime(final long startTime) {
this.mStartTime = startTime;
}
}