Хронометр экономит время при смене фрагмента - PullRequest
0 голосов
/ 08 октября 2018

Итак, у моего приложения есть 1 действие и 4 фрагмента, и у одного из них есть Хронометр, чтобы показать, сколько времени прошло.

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

Я знаю, это потому, что мой метод startStopWatch () находится в OnCreateView, но есть ли способ заставить его продолжить с того места, где он остановился?

Можно ли использовать класс Bundle для решения этой проблемы?Если да, то как?

Вот мой код для хронометра, все в одном фрагменте:

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();
    }
}

И методы:

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();

}

Заранее спасибо.

1 Ответ

0 голосов
/ 08 октября 2018

Попробуйте этот метод

    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();

}

        }

Создайте класс ChronometerHelper, в котором вы сохраните время запуска.

    public class ChronometerHelper {

    @Nullable
    private static Long mStartTime;

    @Nullable
    public Long getStartTime() {
        return mStartTime;
    }

    public void setStartTime(final long startTime) {
        this.mStartTime = startTime;
    }
}
...