gpt4 book ai didi

Android:如何在旋转后恢复停止的计时器状态?

转载 作者:行者123 更新时间:2023-11-29 01:35:36 24 4
gpt4 key购买 nike

我这样做是为了在计时器运行时保存状态并在旋转后恢复状态。 Android_Chronometer pause

当我在 Xsec 停止计时器,然后在 Y 秒后我改变方向时,计时器标记 X+Y 秒。无论过去了多少时间,我都想保留旋转前的停止计时器的时间。我该怎么办?

最佳答案

关于 Chronometer 类以及如何在方向变化中生存,我有一个类似的问题。虽然有几个有用的帖子和示例,但我发现没有一个解决了整个问题。

这是一篇有用的帖子 Android_Chronometer pause ,这有助于证明需要保存 elapsedTime 以恢复计时。

然而,这并没有讨论如何让 Chronometer 在 Android 生命周期方向变化中存活下来。在计时器运行时和暂停时,您对流逝时间的处理方式略有不同。

这是我所做的,将它们放在一起——暂停、恢复、重置、在一个好的类里面,以及幸存的方向:

 public class ChronometerWithPause extends Chronometer {
private long timeWhenStopped = 0;
private boolean isRunning = false;

private final String getTimeKey() {
return "KEY_TIMER_TIME" + getId();
}
private final String getIsRunningKey() {
return "KEY_TIMER_RUNNING" + getId();
}

public ChronometerWithPause(Context context) {
super(context);
}

public ChronometerWithPause(Context context, AttributeSet attrs) {
super(context, attrs);
}

public ChronometerWithPause(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}

@Override
public void start() {
setBase(SystemClock.elapsedRealtime() - timeWhenStopped);
isRunning = true;
super.start();
}

@Override
public void stop() {
isRunning = false;
timeWhenStopped = SystemClock.elapsedRealtime() - getBase();
super.stop();
}

public void reset() {
stop();
isRunning = false;
setBase(SystemClock.elapsedRealtime());
timeWhenStopped = 0;
}

public boolean isRunning() {
return isRunning;
}

public long getCurrentTime() {
return timeWhenStopped;
}

public void setCurrentTime(long time) {
timeWhenStopped = time;
setBase(SystemClock.elapsedRealtime() - timeWhenStopped);
}

public void saveInstanceState(Bundle outState) {
if (isRunning) {
timeWhenStopped = SystemClock.elapsedRealtime() - getBase();
}
outState.putLong(getTimeKey(), getCurrentTime());
outState.putBoolean(getIsRunningKey(), isRunning());
}

public void restoreInstanceState(Bundle inState) {
isRunning = inState.getBoolean(getIsRunningKey());
setCurrentTime(inState.getLong(getTimeKey()));
timeWhenStopped = SystemClock.elapsedRealtime() - getBase();
if (isRunning) {
super.start();
}
}
}

请注意,您可以像这样在 onSaveInstanceState()onCreate() 中使用它:

protected void onSaveInstanceState(Bundle outState) {
...
timer.saveInstanceState(outState);
...

然后在 onCreate 中你可以恢复定时器功能:

if (savedInstanceState != null) {
// . . .
timer.restoreInstanceState(savedInstanceState);
// . . .
}

关于Android:如何在旋转后恢复停止的计时器状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28326221/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com