Java 如何在android studio中停止计时器,然后从停止时重新开始?

Java 如何在android studio中停止计时器,然后从停止时重新开始?,java,android,android-studio,timer,Java,Android,Android Studio,Timer,我正在制作一个Pomodoro定时器应用程序。我已经实现了播放和停止功能。现在我正在尝试实现暂停功能。当我按下“暂停”按钮时,它会成功暂停计时器,但当我再次按下“播放”按钮时,它会从25:00开始重新启动,而不是从我停止的时间开始。如何实现此方法? 代码如下: package com.example.treeplanting; import androidx.appcompat.app.AppCompatActivity; import android.media.MediaPlayer;

我正在制作一个Pomodoro定时器应用程序。我已经实现了播放和停止功能。现在我正在尝试实现暂停功能。当我按下“暂停”按钮时,它会成功暂停计时器,但当我再次按下“播放”按钮时,它会从25:00开始重新启动,而不是从我停止的时间开始。如何实现此方法?

代码如下:

package com.example.treeplanting;

import androidx.appcompat.app.AppCompatActivity;

import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.view.View;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.TextView;

import java.util.concurrent.TimeUnit;

@SuppressWarnings("unused")
public class Pomodoro extends AppCompatActivity {

    private TextView tvTimer, tvMotivationalQuote;
    private ImageView ivStop, ivPause, ivPlay;
    private SeekBar seekBar;

    private CountDownTimer countDownTimer;
    private boolean isRest = false;
    private int userSelectedDuration = -1;

    private final int ONE_SECOND_TICK = 1000;
    private int counter = 0;

    MediaPlayer mediaPlayer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_pomodoro);

        tvTimer = findViewById(R.id.tvTimer);
        tvMotivationalQuote = findViewById(R.id.tvMotivationalQuote);
        ivPlay = findViewById(R.id.ivPlay);
        ivStop = findViewById(R.id.ivStop);
        ivPause = findViewById(R.id.ivPause);

        seekBar = findViewById(R.id.seekBar);

        tvMotivationalQuote.setText(MethodsContainer.getMotivationalQuote());

        // Setting up Seek Bar

        seekBar.setMax(2500);
        seekBar.setProgress(1500);
        seekBar.setVisibility(View.GONE);

        tvTimer.setText("25:00");
    }

    // On click methods

    public void startTimer(View v){
        ivPlay.setClickable(false);

        isRest = false;
        int duration = seekBar.getProgress();
        userSelectedDuration = duration;
        restartTimer(duration);

        ivStop.setClickable(true);
    }

    public void stopTimer(View v){
        ivPlay.setClickable(true);

        seekBar.setProgress(1500);
        tvTimer.setText("25:00");

        ivStop.setClickable(false);
    }

    public void pauseTimer(View v){
        if(countDownTimer != null) {
            countDownTimer.cancel();
        }

        ivPlay.setClickable(true);
    }

    // Update methods

    private void updateTimer(int progress){
        int minutes = progress / 60;
        int seconds = progress - minutes * 60;

        String textMinutes = String.valueOf(minutes);
        String textSeconds = String.valueOf(seconds);

        if(seconds < 10) textSeconds = "0" + textSeconds;
        if(minutes < 10) textMinutes = "0" + textMinutes;

        tvTimer.setText(textMinutes + ":" + textSeconds);
    }

    private void restartTimer(int duration){
        countDownTimer = new CountDownTimer(TimeUnit.SECONDS.toMillis(duration) + 100, ONE_SECOND_TICK) {
            @Override
            public void onTick(long millisUntilFinished) {
                updateTimer((int) millisUntilFinished / 1000);
            }

            @Override
            public void onFinish() {
                breakTimer();

                counter = counter + 1;

                mediaPlayer = MediaPlayer.create(Pomodoro.this, R.raw.alarm);
                mediaPlayer.start();
            }
        };

        countDownTimer.start();
    }

    private void breakTimer(){
        isRest = !isRest;


        if(isRest){
            seekBar.setProgress(300);
            tvTimer.setText("5:00");
            restartTimer(300);
        } else{
            restartTimer(userSelectedDuration);
        }
    }
}
package com.example.treeplanting;
导入androidx.appcompat.app.appcompat活动;
导入android.media.MediaPlayer;
导入android.os.Bundle;
导入android.os.CountDownTimer;
导入android.view.view;
导入android.widget.ImageView;
导入android.widget.SeekBar;
导入android.widget.TextView;
导入java.util.concurrent.TimeUnit;
@抑制警告(“未使用”)
公共类Pomotoro扩展了AppCompative活动{
私人文本视图tvTimer,TVTimoricalQuote;
私有图像查看ivStop、ivPause、ivPlay;
私人SeekBar SeekBar;
私人倒计时;
私有布尔值isRest=false;
private int userSelectedDuration=-1;
私人最终整数1秒刻度=1000;
专用整数计数器=0;
媒体播放器;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pomodoro);
tvTimer=findViewById(R.id.tvTimer);
tvMotivationalQuote=findViewById(R.id.tvMotivationalQuote);
ivPlay=findViewById(R.id.ivPlay);
ivStop=findViewById(R.id.ivStop);
ivPause=findviewbyd(R.id.ivPause);
seekBar=findViewById(R.id.seekBar);
tvMotivationalQuote.setText(MethodsContainer.getMotivationalQuote());
//设置搜索栏
seekBar.setMax(2500);
seekBar.setProgress(1500);
seekBar.setVisibility(View.GONE);
tvTimer.setText(“25:00”);
}
//点击式方法
公共无效起始计时器(视图五){
ivPlay.setClickable(假);
isRest=false;
int duration=seekBar.getProgress();
userSelectedDuration=持续时间;
重启计时器(持续时间);
ivStop.setClickable(真);
}
公共无效停止计时器(视图v){
ivPlay.setClickable(真);
seekBar.setProgress(1500);
tvTimer.setText(“25:00”);
ivStop.setClickable(假);
}
公共空间暂停器(视图v){
if(倒计时!=null){
倒计时。取消();
}
ivPlay.setClickable(真);
}
//更新方法
私有void更新程序(int progress){
int分钟=进度/60;
整数秒=进度-分钟*60;
String textMinutes=String.valueOf(分钟);
String textSeconds=String.valueOf(秒);
如果(秒<10)textSeconds=“0”+textSeconds;
如果(分钟<10)textMinutes=“0”+textMinutes;
tvTimer.setText(textMinutes+“:”+textSeconds);
}
私有void重新启动计时器(int持续时间){
倒计时=新的倒计时(时间单位为秒,持续时间为+100,一秒){
@凌驾
公共void onTick(长毫秒未完成){
updateTimer((int)毫秒/1000);
}
@凌驾
公共无效onFinish(){
中断计时器();
计数器=计数器+1;
mediaPlayer=mediaPlayer.create(Pomodoro.this,R.raw.alarm);
mediaPlayer.start();
}
};
countDownTimer.start();
}
私有void breakTimer(){
isRest=!isRest;
如果(isRest){
seekBar.setProgress(300);
tvTimer.setText(“5:00”);
重启计时器(300);
}否则{
重启计时器(用户选择的持续时间);
}
}
}
****输出:25:00->24:05(我按暂停按钮,它停止…->我按播放按钮->24:59 预期输出:25:00->24:05(我按暂停按钮,它停止…->我按播放按钮->24:04**
**

查看此输出以获取有关开发倒计时应用程序的帮助:


您试图用什么变量存储时间?看起来您正在使用countDownTimer变量来实现这一点,但是您在pauseTimer中将其设置为null;请在您的帖子中进行更改,并验证该应用程序是否仍然无法正常工作。完成。请帮助我,您正在使用
countDownTimer
跟踪剩余时间,但每次重新启动计时器时都要实例化一个新的
countDownTimer
类。