[embedyt] https://www.youtube.com/watch?v=7dQJAkjNEjM[/embedyt]
activity_main.xmlMainActivity.java
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.codinginflow.countdowntimerexample.MainActivity"> <EditText android:id="@+id/edit_text_input" android:layout_width="120dp" android:layout_height="wrap_content" android:layout_above="@+id/text_view_countdown" android:layout_centerHorizontal="true" android:hint="Minutes" android:inputType="number" android:maxLength="4" /> <Button android:id="@+id/button_set" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignTop="@+id/edit_text_input" android:layout_toEndOf="@+id/edit_text_input" android:text="Set" /> <TextView android:id="@+id/text_view_countdown" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:text="00:00" android:textColor="@android:color/black" android:textSize="60sp" /> <Button android:id="@+id/button_start_pause" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/text_view_countdown" android:layout_centerHorizontal="true" android:text="start" /> <Button android:id="@+id/button_reset" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/text_view_countdown" android:layout_marginStart="11dp" android:layout_toEndOf="@+id/button_start_pause" android:text="reset" android:visibility="invisible" tools:visibility="visible" /> </RelativeLayout>
package com.codinginflow.countdowntimerexample; import android.content.SharedPreferences; import android.os.CountDownTimer; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.view.inputmethod.InputMethodManager; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import java.util.Locale; public class MainActivity extends AppCompatActivity { private EditText mEditTextInput; private TextView mTextViewCountDown; private Button mButtonSet; private Button mButtonStartPause; private Button mButtonReset; private CountDownTimer mCountDownTimer; private boolean mTimerRunning; private long mStartTimeInMillis; private long mTimeLeftInMillis; private long mEndTime; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mEditTextInput = findViewById(R.id.edit_text_input); mTextViewCountDown = findViewById(R.id.text_view_countdown); mButtonSet = findViewById(R.id.button_set); mButtonStartPause = findViewById(R.id.button_start_pause); mButtonReset = findViewById(R.id.button_reset); mButtonSet.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String input = mEditTextInput.getText().toString(); if (input.length() == 0) { Toast.makeText(MainActivity.this, "Field can't be empty", Toast.LENGTH_SHORT).show(); return; } long millisInput = Long.parseLong(input) * 60000; if (millisInput == 0) { Toast.makeText(MainActivity.this, "Please enter a positive number", Toast.LENGTH_SHORT).show(); return; } setTime(millisInput); mEditTextInput.setText(""); } }); 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(); } }); } private void setTime(long milliseconds) { mStartTimeInMillis = milliseconds; resetTimer(); closeKeyboard(); } 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; updateWatchInterface(); } }.start(); mTimerRunning = true; updateWatchInterface(); } private void pauseTimer() { mCountDownTimer.cancel(); mTimerRunning = false; updateWatchInterface(); } private void resetTimer() { mTimeLeftInMillis = mStartTimeInMillis; updateCountDownText(); updateWatchInterface(); } private void updateCountDownText() { int hours = (int) (mTimeLeftInMillis / 1000) / 3600; int minutes = (int) ((mTimeLeftInMillis / 1000) % 3600) / 60; int seconds = (int) (mTimeLeftInMillis / 1000) % 60; String timeLeftFormatted; if (hours > 0) { timeLeftFormatted = String.format(Locale.getDefault(), "%d:%02d:%02d", hours, minutes, seconds); } else { timeLeftFormatted = String.format(Locale.getDefault(), "%02d:%02d", minutes, seconds); } mTextViewCountDown.setText(timeLeftFormatted); } private void updateWatchInterface() { if (mTimerRunning) { mEditTextInput.setVisibility(View.INVISIBLE); mButtonSet.setVisibility(View.INVISIBLE); mButtonReset.setVisibility(View.INVISIBLE); mButtonStartPause.setText("Pause"); } else { mEditTextInput.setVisibility(View.VISIBLE); mButtonSet.setVisibility(View.VISIBLE); mButtonStartPause.setText("Start"); if (mTimeLeftInMillis < 1000) { mButtonStartPause.setVisibility(View.INVISIBLE); } else { mButtonStartPause.setVisibility(View.VISIBLE); } if (mTimeLeftInMillis < mStartTimeInMillis) { mButtonReset.setVisibility(View.VISIBLE); } else { mButtonReset.setVisibility(View.INVISIBLE); } } } private void closeKeyboard() { View view = this.getCurrentFocus(); if (view != null) { InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(view.getWindowToken(), 0); } } @Override protected void onStop() { super.onStop(); SharedPreferences prefs = getSharedPreferences("prefs", MODE_PRIVATE); SharedPreferences.Editor editor = prefs.edit(); editor.putLong("startTimeInMillis", mStartTimeInMillis); editor.putLong("millisLeft", mTimeLeftInMillis); editor.putBoolean("timerRunning", mTimerRunning); editor.putLong("endTime", mEndTime); editor.apply(); if (mCountDownTimer != null) { mCountDownTimer.cancel(); } } @Override protected void onStart() { super.onStart(); SharedPreferences prefs = getSharedPreferences("prefs", MODE_PRIVATE); mStartTimeInMillis = prefs.getLong("startTimeInMillis", 600000); mTimeLeftInMillis = prefs.getLong("millisLeft", mStartTimeInMillis); mTimerRunning = prefs.getBoolean("timerRunning", false); updateCountDownText(); updateWatchInterface(); if (mTimerRunning) { mEndTime = prefs.getLong("endTime", 0); mTimeLeftInMillis = mEndTime - System.currentTimeMillis(); if (mTimeLeftInMillis < 0) { mTimeLeftInMillis = 0; mTimerRunning = false; updateCountDownText(); updateWatchInterface(); } else { startTimer(); } } } }