java - CountDownTimer 和 textView - 未正确显示时间
问题描述
CountDownTimer 和 textView - 未正确显示时间。你好!当您按下开始按钮时,计时器将返回。但是当您按下同一个按钮暂停时,屏幕截图中的指针无法正确显示秒数。从 59 跳到 09,从 58 跳到 08,依此类推。帮助修复。
public class MainActivity extends AppCompatActivity implements NumberPicker.OnValueChangeListener {
private TextView textView1;
private Button mButtonStartPause;
private Button mButtonReset;
private CountDownTimer mCountDownTimer;
private boolean mTimerRunning;
private long mStarTimeInMillis;
private long mTimeLeftInMillis;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// NumberPicker
Button buttonSetTime = findViewById(R.id.buttonSetTime);// on click of button display the dialog
buttonSetTime.setOnClickListener(v -> show());
textView1 = findViewById(R.id.textView1);
mButtonStartPause = findViewById(R.id.buttonStart);
mButtonReset = findViewById(R.id.buttonStop);
mButtonStartPause.setOnClickListener(view -> {
setTime();
if(mTimerRunning)
{
pauseTimer();
}
else {
startTimer();
}
});
mButtonReset.setOnClickListener(view -> {
resetTimer();
});
updateCountDownText();
}
@SuppressLint("SetTextI18n")
private void setTime()
{
String input = textView1.getText().toString();
String str1 = input.substring(0, 2);
String str2 = input.substring(4, 5);
long number1 = Long.parseLong(str1);
long number2 = Long.parseLong(str2);
long sumMillisMin = number1 *60000;
long sumMillisSec = number2 *1000;
long millisInput = sumMillisMin + sumMillisSec;
mStarTimeInMillis = millisInput;
mTimeLeftInMillis = mStarTimeInMillis;
textView.setText(Long.toString(mTimeLeftInMillis));
}
@SuppressLint("SetTextI18n")
private void updateCountDownText()
{
long minutes = (mTimeLeftInMillis / 1000) / 60;
long seconds = (mTimeLeftInMillis / 1000) % 60;
String timeLeftFormatted = String.format(Locale.getDefault(),"%02d:%02d", minutes, seconds);
textView1.setText(timeLeftFormatted);
}
private void startTimer()
{
mCountDownTimer = new CountDownTimer(mTimeLeftInMillis, 500) {
@Override
public void onTick(long millisUntilFinished)
{
mTimeLeftInMillis = millisUntilFinished;
updateCountDownText();
}
@Override
public void onFinish()
{
mTimerRunning = false;
mButtonStartPause.setText("Start");
mButtonStartPause.setVisibility(View.INVISIBLE);
mButtonReset.setVisibility(View.VISIBLE);
}
}.start();
mTimerRunning = true;
mButtonStartPause.setText("Pause");
mButtonReset.setVisibility(View.INVISIBLE);
}
private void pauseTimer()
{
mCountDownTimer.cancel();
mTimerRunning = false;
mButtonStartPause.setText("Start");
mButtonReset.setVisibility(View.VISIBLE);
}
private void resetTimer()
{
mTimeLeftInMillis = mStarTimeInMillis;
updateCountDownText();
mButtonReset.setVisibility(View.INVISIBLE);
mButtonStartPause.setVisibility(View.VISIBLE);
}
解决方案
它对我有用
变量和onCreate:
private static final long START_TIME_IN_MILLIS = 60000;
private CountDownTimer mCountDownTimer;
private boolean mTimerRunning = false;
private long mTimeLeftInMillis = START_TIME_IN_MILLIS;
MaterialButton timer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
timer = findViewById(R.id.counter);
timer.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ResetTimer();
StartTimer();
}
});
StartTimer();
}
开始定时器():
private void StartTimer() {
mCountDownTimer = null;
mCountDownTimer = new CountDownTimer(mTimeLeftInMillis, 1000) {
@Override
public void onTick(long millisUntilFinished) {
mTimeLeftInMillis = millisUntilFinished;
UpdateCountDownText();
}
@Override
public void onFinish() {
timer.setEnabled(true);
timer.setText("start");
mTimerRunning = true;
}
}.start();
}
更新计数文本():
private void UpdateCountDownText() {
int min = (int) ((mTimeLeftInMillis / 1000) / 60);
int sec = (int) ((mTimeLeftInMillis / 1000) % 60);
String timeleftformated = String.format(Locale.getDefault(), "%02d:%02d", min, sec);
timer.setText(timeleftformated);
}
复位定时器:
private void ResetTimer() {
mCountDownTimer.cancel();
mTimeLeftInMillis = START_TIME_IN_MILLIS;
UpdateCountDownText();
}
推荐阅读
- python - FileNotFoundError:[Errno 2] 没有这样的文件或目录:'/tmp/cats-v-dog
- reactjs - 让 VSCode 自动完成 React 道具类型和名称?
- r - 用于分组数据和 R 中带有日期的两个变量的 facet ggplot
- c# - 从不完全重复的对象列表中删除多余(重复)对象
- c++ - 如何在 C++ 中异步存储和弹出 uint8_t 从/到 uint32_t?
- java - 无法查看 JSP 文件中的数据
- angular - 用管子测试角分量
- terraform - Terraform 复杂变量定义
- .net-core - SD-WAN 中的 HttpClient
- mysql - 如何仅根据 Laravel 7 中的 HTML 表单值更新特定列