How to create a simple countdown timer in Kotlin?

后端 未结 5 346
迷失自我
迷失自我 2020-12-28 14:17

I know how to create a simple countdown timer in Java. But I\'d like to create this one in Kotlin.

package android.os;

new CountDownTimer(20000, 1000) {
             


        
相关标签:
5条回答
  • 2020-12-28 14:48

    If you want to show a countdown with days hours minutes and seconds

    private lateinit var countDownTimer:CountDownTimer
    .
    .
    .
        fun printDifferenceDateForHours() {
    
                val currentTime = Calendar.getInstance().time
                val endDateDay = "03/02/2020 21:00:00"
                val format1 = SimpleDateFormat("dd/MM/yyyy hh:mm:ss",Locale.getDefault())
                val endDate = format1.parse(endDateDay)
    
                //milliseconds
                var different = endDate.time - currentTime.time
                countDownTimer = object : CountDownTimer(different, 1000) {
    
                    override fun onTick(millisUntilFinished: Long) {
                        var diff = millisUntilFinished
                        val secondsInMilli: Long = 1000
                        val minutesInMilli = secondsInMilli * 60
                        val hoursInMilli = minutesInMilli * 60
                        val daysInMilli = hoursInMilli * 24
    
                        val elapsedDays = diff / daysInMilli
                        diff %= daysInMilli
    
                        val elapsedHours = diff / hoursInMilli
                        diff %= hoursInMilli
    
                        val elapsedMinutes = diff / minutesInMilli
                        diff %= minutesInMilli
    
                        val elapsedSeconds = diff / secondsInMilli
    
                        txt_timeleft.text = "$elapsedDays days $elapsedHours hs $elapsedMinutes min $elapsedSeconds sec"
                    }
    
                    override fun onFinish() {
                        txt_timeleft.text = "done!"
                    }
                }.start()
            }
    

    If you are navigating to another activity/fragment, make sure to cancel the countdown

    countDownTimer.cancel()
    

    Code output

    51 days 17 hs 56 min 5 sec

    0 讨论(0)
  • Chronometer can be set to count down and it seems to me the easiest way.

    Add the Chronometer view in your layout xml, example

    <Chronometer  
     android:id="@+id/view_timer"   
     tools:targetApi="24"  
     android:layout_width="wrap_content"  
     android:layout_height="wrap_content"/>
    

    Then in your activity or fragment:

       view_timer.isCountDown = true
       view_timer.base = SystemClock.elapsedRealtime() + 20000
       view_timer.start()
    
    0 讨论(0)
  • 2020-12-28 15:04

    You can use Kotlin objects:

    val timer = object: CountDownTimer(20000, 1000) {
        override fun onTick(millisUntilFinished: Long) {...}
    
        override fun onFinish() {...}
    }
    timer.start()
    
    0 讨论(0)
  • 2020-12-28 15:07

    I've solved my problem with timer in Kotlin like this:

    class Timer {
    
        private val job = SupervisorJob()
        private val scope = CoroutineScope(Dispatchers.Default + job)
    
        private fun startCoroutineTimer(delayMillis: Long = 0, repeatMillis: Long = 0, action: () -> Unit) = scope.launch(Dispatchers.IO) {
            delay(delayMillis)
            if (repeatMillis > 0) {
                while (true) {
                    action()
                    delay(repeatMillis)
                }
            } else {
                action()
            }
        }
    
        private val timer: Job = startCoroutineTimer(delayMillis = 0, repeatMillis = 20000) {
            Log.d(TAG, "Background - tick")
            doSomethingBackground()
            scope.launch(Dispatchers.Main) {
                Log.d(TAG, "Main thread - tick")
                doSomethingMainThread()
            }
        }
    
        fun startTimer() {
            timer.start()
        }
    
        fun cancelTimer() {
            timer.cancel()
        }
    //...
    }
    

    I've used Coroutines for a timer.

    0 讨论(0)
  • 2020-12-28 15:09

    Try to use objects, like this :

    var countDownTimer = object : CountDownTimer(2000, 1000) {
        // override object functions here, do it quicker by setting cursor on object, then type alt + enter ; implement members
    }
    

    Try this website : https://try.kotlinlang.org/#/Kotlin%20Koans/Introduction/Java%20to%20Kotlin%20conversion/Task.kt

    You have a little button "Convert from Java" on the top right that could be useful to you.

    EDIT:

    Do not forget to start this object when you need it, by adding .start() at the end of the declaration, or wherever in your activity / fragment :

    countDownTimer.start()
    
    0 讨论(0)
提交回复
热议问题