如何从计时器中获取时间?我试过getText,getFormat,getBase等,但没有一个可以工作.
示例代码段:
Chronometer t = (Chronometer)findViewById(R.id.toptime); long time = SystemClock.elapsedRealtime()-t.getBase(); Log.d(null,"Was: "+time); //time is not the proper time for some reason - it is a random number between 0 and 50 t.setBase(SystemClock.elapsedRealtime()); t.start();
nyenyec.. 100
如果你看一下Chronometer类的来源,你会发现它不会在一个字段中存储经过的时间,并且每次需要更新显示时都会在内部计算它.
但是,在您自己的代码中执行相同操作相对容易:
long elapsedMillis = SystemClock.elapsedRealtime() - chronometerInstance.getBase();
这假设你已经开始了这样的事情:
chronometerInstance.setBase(SystemClock.elapsedRealtime()); chronometerInstance.start();
这是一个完整的例子:
public class ChronoExample extends Activity { Chronometer mChronometer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LinearLayout layout = new LinearLayout(this); layout.setOrientation(LinearLayout.VERTICAL); mChronometer = new Chronometer(this); layout.addView(mChronometer); Button startButton = new Button(this); startButton.setText("Start"); startButton.setOnClickListener(mStartListener); layout.addView(startButton); Button stopButton = new Button(this); stopButton.setText("Stop"); stopButton.setOnClickListener(mStopListener); layout.addView(stopButton); Button resetButton = new Button(this); resetButton.setText("Reset"); resetButton.setOnClickListener(mResetListener); layout.addView(resetButton); setContentView(layout); } private void showElapsedTime() { long elapsedMillis = SystemClock.elapsedRealtime() - mChronometer.getBase(); Toast.makeText(ChronoExample.this, "Elapsed milliseconds: " + elapsedMillis, Toast.LENGTH_SHORT).show(); } View.OnClickListener mStartListener = new OnClickListener() { public void onClick(View v) { mChronometer.start(); showElapsedTime(); } }; View.OnClickListener mStopListener = new OnClickListener() { public void onClick(View v) { mChronometer.stop(); showElapsedTime(); } }; View.OnClickListener mResetListener = new OnClickListener() { public void onClick(View v) { mChronometer.setBase(SystemClock.elapsedRealtime()); showElapsedTime(); } }; }
关于天文台表的一个令人困惑的事情是你无法真正将它用作秒表,它可以再次启动,停止和重启.当它运行时,它将始终显示自您上次重置它以来经过的时间,无论多少次以及您在此期间停止了多长时间.当它停止时,它只是停止更新显示.
如果您需要类似秒表的东西,您必须使用Chronometer子类或使用源创建您自己的版本.
如果你看一下Chronometer类的来源,你会发现它不会在一个字段中存储经过的时间,并且每次需要更新显示时都会在内部计算它.
但是,在您自己的代码中执行相同操作相对容易:
long elapsedMillis = SystemClock.elapsedRealtime() - chronometerInstance.getBase();
这假设你已经开始了这样的事情:
chronometerInstance.setBase(SystemClock.elapsedRealtime()); chronometerInstance.start();
这是一个完整的例子:
public class ChronoExample extends Activity { Chronometer mChronometer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LinearLayout layout = new LinearLayout(this); layout.setOrientation(LinearLayout.VERTICAL); mChronometer = new Chronometer(this); layout.addView(mChronometer); Button startButton = new Button(this); startButton.setText("Start"); startButton.setOnClickListener(mStartListener); layout.addView(startButton); Button stopButton = new Button(this); stopButton.setText("Stop"); stopButton.setOnClickListener(mStopListener); layout.addView(stopButton); Button resetButton = new Button(this); resetButton.setText("Reset"); resetButton.setOnClickListener(mResetListener); layout.addView(resetButton); setContentView(layout); } private void showElapsedTime() { long elapsedMillis = SystemClock.elapsedRealtime() - mChronometer.getBase(); Toast.makeText(ChronoExample.this, "Elapsed milliseconds: " + elapsedMillis, Toast.LENGTH_SHORT).show(); } View.OnClickListener mStartListener = new OnClickListener() { public void onClick(View v) { mChronometer.start(); showElapsedTime(); } }; View.OnClickListener mStopListener = new OnClickListener() { public void onClick(View v) { mChronometer.stop(); showElapsedTime(); } }; View.OnClickListener mResetListener = new OnClickListener() { public void onClick(View v) { mChronometer.setBase(SystemClock.elapsedRealtime()); showElapsedTime(); } }; }
关于天文台表的一个令人困惑的事情是你无法真正将它用作秒表,它可以再次启动,停止和重启.当它运行时,它将始终显示自您上次重置它以来经过的时间,无论多少次以及您在此期间停止了多长时间.当它停止时,它只是停止更新显示.
如果您需要类似秒表的东西,您必须使用Chronometer子类或使用源创建您自己的版本.
我发现这个例子非常有用,感谢nyenyec!
这是关于如何将其变成真正的秒表功能的两分钱,没有子类计时器.只需更改mStartListener方法来解析mChronometer中的文本(它毕竟是从TextView派生的),计算毫秒数,并使用setBase()将基准时间重新调整为过去的那段时间:
View.OnClickListener mStartListener = new OnClickListener() { public void onClick(View v) { int stoppedMilliseconds = 0; String chronoText = mChronometer.getText().toString(); String array[] = chronoText.split(":"); if (array.length == 2) { stoppedMilliseconds = Integer.parseInt(array[0]) * 60 * 1000 + Integer.parseInt(array[1]) * 1000; } else if (array.length == 3) { stoppedMilliseconds = Integer.parseInt(array[0]) * 60 * 60 * 1000 + Integer.parseInt(array[1]) * 60 * 1000 + Integer.parseInt(array[2]) * 1000; } mChronometer.setBase(SystemClock.elapsedRealtime() - stoppedMilliseconds); mChronometer.start(); } };