- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我制作了一个运行完美的倒计时器 - 您可以获得软/中/硬煮鸡蛋的正确时间。我的问题是计时器在方向改变后重置。我已经用谷歌搜索并尝试了很多解决方案,但我仍然不明白如何正确使用 onSave 和 onRestore 。这是我的代码:
有什么建议吗?
package com.dohman.boilaneggbae;
import android.graphics.PorterDuff;
import android.os.CountDownTimer;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.util.Locale;
import java.util.concurrent.TimeUnit;
public class MainActivity extends AppCompatActivity {
private static final String CURRENT_TIME = "currentTime";
private static final String DURATION_TIME = "durationTime";
private long currentTime;
private int durationTime;
private TextView time;
private Button buttonLargeSize;
private Button buttonMediumSize;
private Button buttonSoft;
private Button buttonMedium;
private Button buttonHard;
private Button buttonHellaHard;
private CountDownTimer countDownTimer;
private EggSize mediumOrLarge = EggSize.UNDEFINED;
private boolean alreadyRunning = false;
enum EggSize {
UNDEFINED, MEDIUM, LARGE;
}
private View.OnClickListener btnMediumSizeClickListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
mediumOrLarge = EggSize.MEDIUM;
}
};
private View.OnClickListener btnLargeSizeClickListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
mediumOrLarge = EggSize.LARGE;
}
};
private View.OnClickListener btnSoftClickListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
if ((mediumOrLarge != EggSize.UNDEFINED) && (alreadyRunning == false)) {
alreadyRunning = true;
durationTime = 240;
start(240);
} else if (mediumOrLarge == EggSize.UNDEFINED) {
time.setText("Choose size first");
} else {
alreadyRunning = false;
cancel();
}
}
};
@Override
protected void onSaveInstanceState(Bundle savedInstanceState) {
savedInstanceState.putLong(CURRENT_TIME, currentTime);
savedInstanceState.putInt(DURATION_TIME, durationTime);
super.onSaveInstanceState(savedInstanceState);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState != null) {
currentTime = savedInstanceState.getLong(CURRENT_TIME);
durationTime = savedInstanceState.getInt(DURATION_TIME);
}
time = findViewById(R.id.time);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
currentTime = savedInstanceState.getLong(CURRENT_TIME);
durationTime = savedInstanceState.getInt(DURATION_TIME);
currentTime -= durationTime;
}
private void start(int duration) {
time.setText("");
if (mediumOrLarge == EggSize.MEDIUM) {
duration -= 60;
}
countDownTimer = new CountDownTimer(duration * 1000, 1000) {
@Override
public void onTick(long millisUntilFinished) {
String text = String.format(Locale.getDefault(), "%02d:%02d",
TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished) % 60,
TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished) % 60);
time.setText(text);
}
countDownTimer.start();
}
}
最佳答案
我终于解决了这个问题!使用此链接: https://codinginflow.com/code-examples/android/countdown-timer/part-2
这些是代码:
package com.codinginflow.countdowntimerexample;
import android.os.CountDownTimer;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.util.Locale;
public class MainActivity extends AppCompatActivity {
private static final long START_TIME_IN_MILLIS = 600000;
private TextView mTextViewCountDown;
private Button mButtonStartPause;
private Button mButtonReset;
private CountDownTimer mCountDownTimer;
private boolean mTimerRunning;
private long mTimeLeftInMillis = START_TIME_IN_MILLIS;
private long mEndTime;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextViewCountDown = findViewById(R.id.text_view_countdown);
mButtonStartPause = findViewById(R.id.button_start_pause);
mButtonReset = findViewById(R.id.button_reset);
mButtonStartPause.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mTimerRunning) {
pauseTimer();
} else {
startTimer();
}
}
});
mButtonReset.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
resetTimer();
}
});
updateCountDownText();
}
private void startTimer() {
mEndTime = System.currentTimeMillis() + mTimeLeftInMillis;
mCountDownTimer = new CountDownTimer(mTimeLeftInMillis, 1000) {
@Override
public void onTick(long millisUntilFinished) {
mTimeLeftInMillis = millisUntilFinished;
updateCountDownText();
}
@Override
public void onFinish() {
mTimerRunning = false;
updateButtons();
}
}.start();
mTimerRunning = true;
updateButtons();
}
private void pauseTimer() {
mCountDownTimer.cancel();
mTimerRunning = false;
updateButtons();
}
private void resetTimer() {
mTimeLeftInMillis = START_TIME_IN_MILLIS;
updateCountDownText();
updateButtons();
}
private void updateCountDownText() {
int minutes = (int) (mTimeLeftInMillis / 1000) / 60;
int seconds = (int) (mTimeLeftInMillis / 1000) % 60;
String timeLeftFormatted = String.format(Locale.getDefault(), "%02d:%02d", minutes, seconds);
mTextViewCountDown.setText(timeLeftFormatted);
}
private void updateButtons() {
if (mTimerRunning) {
mButtonReset.setVisibility(View.INVISIBLE);
mButtonStartPause.setText("Pause");
} else {
mButtonStartPause.setText("Start");
if (mTimeLeftInMillis < 1000) {
mButtonStartPause.setVisibility(View.INVISIBLE);
} else {
mButtonStartPause.setVisibility(View.VISIBLE);
}
if (mTimeLeftInMillis < START_TIME_IN_MILLIS) {
mButtonReset.setVisibility(View.VISIBLE);
} else {
mButtonReset.setVisibility(View.INVISIBLE);
}
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putLong("millisLeft", mTimeLeftInMillis);
outState.putBoolean("timerRunning", mTimerRunning);
outState.putLong("endTime", mEndTime);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
mTimeLeftInMillis = savedInstanceState.getLong("millisLeft");
mTimerRunning = savedInstanceState.getBoolean("timerRunning");
updateCountDownText();
updateButtons();
if (mTimerRunning) {
mEndTime = savedInstanceState.getLong("endTime");
mTimeLeftInMillis = mEndTime - System.currentTimeMillis();
startTimer();
}
}
}
编辑:由于某种原因,我无法将自己的答案标记为解决方案,但无论如何这个问题已经解决了。 (已回答)
关于java - 方向改变后保持 CountDownTimer 运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48477168/
我收到以下错误: Error:(104, 51) error: constructor CountDownTimer in class CountDownTimer cannot be applied
我的程序中有两个倒计时器,一个较长的(120 秒)和一个较短的(3.5 秒)。我希望 120 秒计时器在 3.5 秒计时器运行时暂停,而较长的计时器在 3.5 秒计时器不运行时继续运行。因此,程序从剩
我正在尝试制作一个问题游戏来提高我的技能。用户选择游戏时间(在本例中假设为 10 分钟),对于每个问题,他们有 10 秒或其他时间来回答。两个计时器都工作正常,但是当 10 秒计数器到达终点时,如何重
我正在使用CountDownTimer。我想在特定时间播放声音,仅供引用。好了,这是我的代码: @Override public void onTick(long l) {
所以我有一个“开始”按钮 1,当单击它时,它会从 EditText1 获取文本,然后调用 CountDownTimer 来调用一个方法,该方法通过其参数从 EditText1 传递文本,并每 10 秒
我正在为 Android 开发。我正在使用倒计时器来显示特定日期的倒计时。在撰写本文时,它应该显示接近 18dys 12hrs 30min 55s 的内容。但我得到了49dys 19hrs 28min
在下面的简单代码中,我想为 CountDownTimer 设置无限的间隔。我找不到此操作的任何文档。 public class MyCountDownTimer extends CountDownTi
我将计时器初始化为 11000 毫秒,通过日志我看到计时器从 10959 毫秒变为 1484 毫秒 private void startGameCountDown() { mCount
CountDownTimer 的 StartButton 有问题:按下按钮后计时器没有启动。我该如何解决? 我想通过按下按钮 buttonCount 来启动计时器。有人可以帮帮我吗? int clic
我想在特定情况下暂停倒数计时器。但在我的代码中,一旦启动,即使 mIntheGym 为假,它也永远不会停止。请帮我解决这个问题。提前致谢。 下面是我的代码。 TimerTask doAsync
这个问题的其他实例都没有解决我的问题。我有一个出现在事务序列末尾的 fragment 。它用于在其中包含的 CountDownTimer 倒计时时关闭应用程序: class TerminalFragm
我的应用程序包含一个CountDownTimer(15 分钟)和一个应用程序列表(浏览器、计算器、音乐等)。我想要的是当我从此列表运行应用程序时,所选应用程序正常启动并在计数器完成后关闭。 我使用此代
我有一款游戏需要在特定时间段内生成生物,我通过执行一个 CountDownTimer 来做到这一点,它在完成时调用自身,如下所示: private void startTimer(final long
我是 android 的新手,我遇到了一个问题。 这是我的问题:我正在运行 CountDownTimer 30 秒,间隔为 5 秒。当它运行时,我为每个间隔做一个 Activity 。如果 Activ
我在这里定义倒计时。 然后,在 onclick 方法中为该变量定义新的倒数计时器: public void showQuestion(int questionNumber){ quest
我根据在 Google 中搜索的教程创建了一个倒数计时器。但是我无法继续倒计时。当我按下按钮时,它会从 10 开始重新启动。 我想创建一个能够暂停和恢复的倒数计时器。谢谢!这是我的代码: import
我正在尝试为我的应用程序创建一个倒计时计时器,但在执行此操作后,应该显示剩余时间的 TextView 没有显示任何内容,因此我的计时器无法正常工作。我不知道我是否错过了什么。 这是我的计时器: se
我想在“后退”按钮上完成我的 CountdownTimer。我知道有一些类似的问题,但这对我的问题没有帮助。 我在 onCreate() 中得到以下代码 @Override
您好,我正在尝试暂停和恢复我的 CountDownTimer,但它不起作用,首先我将 millisUntilFinished 变量设置为 futureMins 并在 onClick() 我的事件监听器
在我的应用程序中,我想根据系统时间和我的时间使用CountDownTimer。如果我的时间是 14:30:30 而系统时间是 14:00:00,那么如何在我的应用程序中设置 30 分钟计时器? 这是我
我是一名优秀的程序员,十分优秀!