San*_*ago 8 android chronometer
我确实有一个服务在后台运行.每当它开始时,我在内存中存储起始时间(以毫秒为单位):
startingTime = new Date().getTime();
Run Code Online (Sandbox Code Playgroud)
我想显示一个计时器,它在服务启动时开始计数,并且在用户按下按钮之前永远不会停止.我想让用户离开活动渲染计时器,做一些事情,然后返回.但想法是,当用户返回时,我不希望计时器再次进入0:00.Insted我希望它显示自服务启动以来的确切时间.
每次用户返回计时器活动时,我都可以计算elapsedTime:
elapsedTime = new Date().getTime() - startingTime;
Run Code Online (Sandbox Code Playgroud)
问题是,我不知道如何告诉计时器从那个时候开始计数!
将其设置为计时器基座不起作用.有人可以解释一下究竟"基础"意味着什么或如何实现这一目标?
非常感谢!BYE
Mac*_*rse 21
你可以使用天文台表.
您还应该检查此线程.
编辑:解决方案:
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);
// Set the initial value
mChronometer.setText("00:10");
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) {
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();
}
};
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();
}
};
}
Run Code Online (Sandbox Code Playgroud)
小智 7
要启动天文钟,您应该将天文钟的setBase()方法与配合使用SystemClock.elapsedRealTime()。像这样:
mChronometer.setBase(SystemClock.elapsedRealTime())
Run Code Online (Sandbox Code Playgroud)
但是,如果要在其他时间开始,则必须减去所需的时间(以毫秒为单位)。例如,您想在10秒时启动计时器:
mChronometer.setBase(SystemClock.elapsedRealTime() - 10*1000);
Run Code Online (Sandbox Code Playgroud)
2分钟后:
mChronometer.setBase(SystemClock.elapsedRealTime() - 2*60*1000);
Run Code Online (Sandbox Code Playgroud)
但是这里的问题是,计时码表将在开始计时之前显示“ 00:00”,要更改为您的时间,您必须这样做:
mChronometer.setText("02:00");
Run Code Online (Sandbox Code Playgroud)
基准时间是Chronometer开始滴答的时间。您可以使用Chronometer.setBase(). 您应该使用SystemClock.getElapsedTime(). setBase()每次启动时调用开始时间Chronometer。如果有潜在的Activity被破坏和重建,而计时器仍处于活动状态,那么你将需要持有的基本时间之外的某个地方Activity拥有的Chronometer。
| 归档时间: |
|
| 查看次数: |
39913 次 |
| 最近记录: |