计时器 android

Chronometer android

请帮帮我,我做了我的拳头 android 应用程序,计时器,但这里出了点问题,我不知道是什么。当我点击 Start 时,计时器运行正常,但是当我点击 Stop(或 Reset)时,然后再次 Start 继续它将是 00:0(, 00:0*, 00:0/,.. .

我的代码:

import android.os.Bundle;
import android.os.SystemClock;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.Chronometer;
import android.widget.TextView;

/**
 * Created by Admin on 6/26/2015.
 */
public class Tab1 extends Fragment implements View.OnClickListener {
    private Button buttonStart;
    private Button buttonStop;
    private Button buttonReset;
    private Chronometer chronometerRun;
    long time = 0;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v=inflater.inflate(R.layout.tab_1,container,false);

        buttonStart=(Button)v.findViewById(R.id.buttonStrart);
        buttonStop=(Button)v.findViewById(R.id.buttonStop);
        buttonReset=(Button)v.findViewById(R.id.buttonReset);
        chronometerRun=(Chronometer)v.findViewById(R.id.chronometerRunning);

        buttonStart.setOnClickListener(this);
        buttonStop.setOnClickListener(this);
        buttonReset.setOnClickListener(this);

        return v;
    }

    public void onClick(View v) {
        switch(v.getId())
        {
            case R.id.buttonStrart:
                chronometerRun.setBase(SystemClock.elapsedRealtime() + time);
                chronometerRun.start();
                break;
            case  R.id.buttonStop:
                time = chronometerRun.getBase()+SystemClock.elapsedRealtime();
                chronometerRun.stop();
                break;
            case R.id.buttonReset:
                chronometerRun.setBase(SystemClock.elapsedRealtime());
                chronometerRun.stop();
                break;

        }


    }
}

我从您的代码中了解到,您使用的 setBase 方法有误。它允许您设置天文台自动作为参考的基准时间。然后 Chronometer 通过将当前时间与 setBase 方法中设置的值区分开来自动更新其视图,即 Chronometer 将当前时间设置为 SystemClock.elapsedRealtime() - getBase().

由于您将 time 添加到 SystemClock.elapsedRealtime(),当您的 time 不为零时,它会给出当前时间的负值。

相反,您应该做的是在停止时将 time 设置为 SystemClock.elapsedRealtime()-chronometerRun.getBase(),以保持自计时器开始以来经过的时间,然后从中减去 time SystemClock.elapsedRealtime() 同时设置基准以在暂停时保持上次时差,您应该在重置时将 time 设置为 0 以便从零开始计时,即将基准时间设置为当前时间时间。

下面的 switch case 代码工作正常:

switch(v.getId())
    {
        case R.id.buttonStart:
            Log.i("test",""+SystemClock.elapsedRealtime() + time);
            chronometerRun.setBase(SystemClock.elapsedRealtime()-time) ;
            chronometerRun.start();
            break;
        case  R.id.buttonStop:
            Log.i("test",""+SystemClock.elapsedRealtime() + time);
            time = SystemClock.elapsedRealtime()-chronometerRun.getBase();
            chronometerRun.stop();
            break;
        case R.id.buttonReset:
            Log.i("test",""+SystemClock.elapsedRealtime() + time);
            time=0;
            chronometerRun.setBase(SystemClock.elapsedRealtime());
            chronometerRun.stop();
            break;

    }

注意:在调试时使用Log.i("TAG",""+variableToWatch)观察相关变量总是有用的,看看它们是如何变化的。

我在你所有的案例陈述之后添加了 Log.i("test",""+SystemClock.elapsedRealtime() + time); 以查看 time

的值