【问题标题】:Chronometer save time on fragment change计时码表节省碎片更换时间
【发布时间】:2019-03-12 19:29:35
【问题描述】:

所以我的应用有 1 个活动和 4 个片段,其中一个有 Chronometer 来显示经过了多少时间。

它工作正常,但我有一个问题,每次我移动到另一个片段并返回时,计时器都会回到 00:00。

我知道这是因为我的 startStopWatch() 方法在 OnCreateView 中,但是有什么方法可以让它从它停止的地方继续?

是否可以使用 Bundle 类来解决这个问题?如果有,怎么做?

这是我的 Chronometer 代码,都在一个片段中:

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

}

提前致谢。

【问题讨论】:

    标签: android android-fragments timer stopwatch chronometer


    【解决方案1】:

    试试这个方法

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

    【讨论】:

    • 乐于助人:)
    • 你能再帮我一件事吗?我还想在按下按钮时将秒表设置为 00:00,但我该怎么做呢?我做了一个名为 stopStopWatch() 的方法,它有两行代码,它们是 chronometer.setBase(SystemClock.elapsedRealtime());和 chronometer.stop();并在按下按钮时调用此方法,但似乎不起作用。
    • 再次感谢!
    • 嘿,很抱歉打扰你,但我发现我的计时器并没有真正停止,而是回到 00:00,你能帮我解决这个问题吗?我试图自己解决这个问题,但无法真正找到解决方案。 stackoverflow.com/questions/52699035/…
    猜你喜欢
    • 1970-01-01
    • 2017-07-31
    • 2013-06-28
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多