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" />
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
Android Room - Simple Select Query - Cannot Access Database on the Main Thread
Steps to Create APK Expansion File
Android: Scale a Drawable or Background Image
Android Studio Marks R in Red with Error Message "Cannot Resolve Symbol R", But Build Succeeds
Using Alarmmanager to Start a Service at Specific Time
How to Display a Dialog from a Service
Outlined Edit Text from Material Design
How to Crop Circular Area from Bitmap in Android
How to Get the Actionbar Height
List of Android Permissions Normal Permissions and Dangerous Permissions in API 23
How to Customize Snackbar's Layout
Android Open and Save Files To/From Google Drive Sdk
How to Fire Onlistitemclick in Listactivity with Buttons in List
How to Change Spinner Text Size and Text Color
Sending Message Through Whatsapp
How to Change Font Face of Webview in Android