How to Make a Countdown Timer in Android

How to make a countdown timer in Android?

As shown in the documentation for CountDownTimer:

new CountDownTimer(30000, 1000) {

public void onTick(long millisUntilFinished) {
mTextField.setText("seconds remaining: " + millisUntilFinished / 1000);
// logic to set the EditText could go here
}

public void onFinish() {
mTextField.setText("done!");
}

}.start();

How to create a simple countdown timer in Kotlin?

You can use Kotlin objects:

val timer = object: CountDownTimer(20000, 1000) {
override fun onTick(millisUntilFinished: Long) {...}

override fun onFinish() {...}
}
timer.start()

How to make Countdown timer to show same time in all Activities

Use the single instance of your CounterClass throughout all the Activities/Fragments

Use static method to initialize getInstance and retrieve values getFormatedTime().

public class CounterClass  extends CountDownTimer{

private static String hms;
private static CounterClass instance;

private CounterClass(long millisInFuture, long countDownInterval){
super(millisInFuture,countDownInterval);
}

public static CounterClass initInstance(long millisInFuture, long countDownInterval){
if(instance==null){
instance = new CounterClass(millisInFuture,countDownInterval);
}
return instance;
}

public static CounterClass getInstance() throws Exception{
if(instance==null){
throw new Exception("Parameters not initialized. Initiate with initInstance");
}else{
return instance;
}
}

public static String getFormatedTime(){
return hms;
}
@Override
public void onTick(long l) {

long millis= l;
hms= String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(millis),
TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)),
TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis))
);
}
@Override
public void onFinish() {

}
}

I have modified the code.

Inorder to initiate the CounterClass, do the following.

CounterClass counterClass = CounterClass.initInstance(180000, 1000);
counterClass.start();

For accessing the previous value

try {
CounterClass counterClass = CounterClass.getInstance();
Log.i("TAG 222", counterClass.getFormatedTime());
} catch (Exception e) {
e.printStackTrace();
// counter class is not initiated , access initInstance
}

As android.os.CountDownTimer does not have default constructor, this is the way we can achieve your requirement

How to Countdown to a day using Android CountDownTimer

This is exactly how you do it

UPDATE 3

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setContentView(R.layout.your_layout);

TextView tv_countdown = (TextView) findViewById(R.id.your_textview_id);

Calendar start_calendar = Calendar.getInstance();
Calendar end_calendar = Calendar.getInstance();

long start_millis = start_calendar.getTimeInMillis(); //get the start time in milliseconds
long end_millis = end_calendar.getTimeInMillis(); //get the end time in milliseconds
long total_millis = (end_millis - start_millis); //total time in milliseconds
end_calendar.set(2015, 10, 6); // 10 = November, month start at 0 = January

//1000 = 1 second interval
CountDownTimer cdt = new CountDownTimer(total_millis, 1000) {
@Override
public void onTick(long millisUntilFinished) {
long days = TimeUnit.MILLISECONDS.toDays(millisUntilFinished);
millisUntilFinished -= TimeUnit.DAYS.toMillis(days);

long hours = TimeUnit.MILLISECONDS.toHours(millisUntilFinished);
millisUntilFinished -= TimeUnit.HOURS.toMillis(hours);

long minutes = TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished);
millisUntilFinished -= TimeUnit.MINUTES.toMillis(minutes);

long seconds = TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished);

tv_countdown.setText(days + ":" + hours + ":" + minutes + ":" + seconds); //You can compute the millisUntilFinished on hours/minutes/seconds
}

@Override
public void onFinish() {
tv_countdown.setText("Finish!");
}
};
cdt.start();
}

Timers in Android Studio using CountDownTimer

I have some source code similar to your questions just implement your project.

Init Variables

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;

onCreate

//Init
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(); //pauseFunction
} else {
startTimer(); //StartFunction
}
}
});



mButtonReset.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
resetTimer(); // resetFunction
}
});
updateCountDownText(); //updateEverySecond

startTimer()

mCountDownTimer = new CountDownTimer(mTimeLeftInMillis, 1000) {
@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);

pauseTimer()

    mCountDownTimer.cancel();
mTimerRunning = false;
mButtonStartPause.setText("Start");
mButtonReset.setVisibility(View.VISIBLE);

resetTimer()

    mTimeLeftInMillis = START_TIME_IN_MILLIS;
updateCountDownText();
mButtonReset.setVisibility(View.INVISIBLE);
mButtonStartPause.setVisibility(View.VISIBLE);

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

and Finally XML

    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" />
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" />
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" />

How to Show Countdown timer in HH:MM:SS (Hours : Minutes : Seconds)

It's helpful for you

 private void startTimer(int noOfMinutes) {
CountDownTimer countDownTimer = new CountDownTimer(noOfMinutes, 1000) {
public void onTick(long millisUntilFinished) {
long millis = millisUntilFinished;
//Convert milliseconds into hour,minute and seconds
String hms = String.format("%02d:%02d:%02d",
TimeUnit.MILLISECONDS.toHours(millis),
TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)), TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)));
countdownTimerText.setText(hms);//set text
}
public void onFinish() {
countdownTimerText.setText("TIME'S UP!!"); //On finish change timer text
}
}.start();

Edited

//1584700200 is timestamp in milii seconds (Friday, March 20, 2020 10:30:00 AM) 
//1000(1sec) is time interval to call onTick method

new CountDownTimer(1584700200, 1000){

@Override

public void onTick(long millisUntilFinished) {
long millis = millisUntilFinished;
String hms = String.format("%02d:%02d:%02d:%02d",
TimeUnit.HOURS.toDays(TimeUnit.MILLISECONDS.toHours(millis)),
(TimeUnit.MILLISECONDS.toHours(millis) -
TimeUnit.DAYS.toHours(TimeUnit.MILLISECONDS.toDays(millis))),
(TimeUnit.MILLISECONDS.toMinutes(millis) -
TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis))), (TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis))));
countdownTimerText.setText(hms);//set text
}

@Override

public void onFinish() {
/*clearing all fields and displaying countdown finished message */

countdownTimerText.setText("Count down completed");
}
}.start();
}

Kotlin

private fun countDown() {
val countDownTimer = object : CountDownTimer(1584700200, 1000) {
override fun onTick(p0: Long) {
val millis: Long = p0
val hms = String.format(
"%02d:%02d:%02d:%02d",
TimeUnit.HOURS.toDays(TimeUnit.MILLISECONDS.toDays(millis)),
(TimeUnit.MILLISECONDS.toHours(millis) - TimeUnit.DAYS.toHours(
TimeUnit.MILLISECONDS.toDays(
millis
)
)),
(TimeUnit.MILLISECONDS.toMinutes(millis) -
TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis))),
(TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(
TimeUnit.MILLISECONDS.toMinutes(millis)
))
)

System.out.println("Time : " + hms)
countdownTimerText.setText(hms);//set text
}

override fun onFinish() {
/*clearing all fields and displaying countdown finished message */
countdownTimerText.setText("Count down completed");
System.out.println("Time up")
}
}
countDownTimer.start()
}

Count down timer showing negative number error android

I think the problem might be that startTimer() could be called multiple times. mTimer will be overwritten with a new timer. And the old timer will keep running forever, because even if the old timer reaches 0 that old timer will then cancel the new timer by calling stopTimer(). A solution might be to call mTimer.cancel() (or stopTimer()) at the start of startTimer()



Related Topics



Leave a reply



Submit