CountDownTimer and textView - not displaying time correctly

131 views Asked by At

CountDownTimer and textView - not displaying time correctly. Hello! When you press the start button, the timer will return. But when you press the same button to pause, it is the pointer in the screenshot that does not display the seconds correctly. Jumps from 59 to 09, from 58 to 08, and so on. Help fix.

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);
}

enter image description here
enter image description here

1

There are 1 answers

0
peyman On

It work for me

variable and 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();

}

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();

}

UpdateCountDownText():

    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);

}

resetTimer:

private void ResetTimer() {
    mCountDownTimer.cancel();
    mTimeLeftInMillis = START_TIME_IN_MILLIS;
    UpdateCountDownText();
}