天文台安卓

时间:2015-07-07 02:32:21

标签: android chronometer

请帮助我,我做了我的拳头安卓应用程序,计时器,但这里有些错误,我不知道是什么。当我点击开始时,天文台运行正常,但当我点击停止(或重置),然后再次开始继续它将是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;

        }


    }
}

1 个答案:

答案 0 :(得分:0)

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

由于您要将time添加到SystemClock.elapsedRealtime(),因此当time非零时,它会为当前时间提供负值。

相反,你应该做的是在停止时将time设置为SystemClock.elapsedRealtime()-chronometerRun.getBase(),以便保持自计时器开始以来经过了多长时间,然后从{{减去time 1}}设置基数以保持暂停时的最后时差,并且您应该在重置时将SystemClock.elapsedRealtime()设置为time,以便从零开始计时器,即将基准时间设置为当前时间。

以下开关案例代码正常工作:

0

注意:在调试时使用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);

的值