Android Kotlin CountDown Таймер для добавления времени - PullRequest
0 голосов
/ 04 октября 2018

в таймере я использую как добавить время при нажатии кнопки?например, я хочу, чтобы millisUntilFinished увеличился на 5 секунд при нажатии кнопки.Я пытался с глобальной переменной, но это не так.

 object :CountDownTimer(10000,1000){
            override fun onFinish() {

                timeText.text = "Left : 0"
                handler.removeCallbacks(runnable)
                for (image in imageArray){
                    image.visibility = View.INVISIBLE
                }
                for (add in timeAdd){
                    add.visibility = View.INVISIBLE
                }
                button.visibility = View.VISIBLE
            }

            override fun onTick(millisUntilFinished: Long) {
                 timeText.text = "Left : "+millisUntilFinished/1000
            }

        }.start()

Ответы [ 3 ]

0 голосов
/ 04 октября 2018

Когда @ TheWanderer ответил, вы не можете обновить millisUntilFinished, поскольку в CountDownTimer class такой метод недоступен.

Для обновления таймера вам нужноостановить текущий таймер и запустить новый таймер с обновленным значением millisInFuture.Вот пример кода, который поможет вам достичь того, что вы хотите.

    var timer: Timer?=null

    //Call this method to start timer on activity start
    private fun startTimer(){
        timer = Timer(10000);
        timer?.start()
    }

    //Call this method to update the timer
    private fun updateTimer(){
        if(timer!=null) {
            val miliis = timer?.millisUntilFinished + TimeUnit.SECONDS.toMillis(5)
            //Here you need to maintain single instance for previous
            timer?.cancel()
            timer = Timer(miliis);
            timer?.start()
        }else{
            startTimer()
        }
    }

    inner class Timer(miliis:Long) : CountDownTimer(miliis,1000){
        var millisUntilFinished:Long = 0
        override fun onFinish() {
            timeText.text = "Left : 0"
            handler.removeCallbacks(runnable)
            for (image in imageArray){
                image.visibility = View.INVISIBLE
            }
            for (add in timeAdd){
                add.visibility = View.INVISIBLE
            }
            button.visibility = View.VISIBLE
        }

        override fun onTick(millisUntilFinished: Long) {
            this.millisUntilFinished = millisUntilFinished
            timeText.text = "Left : "+millisUntilFinished/1000
        }
    }
0 голосов
/ 05 октября 2018

Вот таймер обратного отсчета, который мы используем

    fun message(msg:String){
    object : CountDownTimer(4000, 1000) {
        override fun onTick(millisUntilFinished: Long) {
            tvMsg.visibility = View.VISIBLE
            tvMsg.text = msg
        }
        override fun onFinish() {
            tvMsg.visibility = View.INVISIBLE
            tvMsg.text = ""
        }
    }.start()
}

И наше использование простого таймера

        if (result) {
        etItemData.setText("")
        message("Record Removed")
        Timer().schedule(1000){
            thisACTIVITY()
        }

Котлин жалуется на это, не зная, почему

0 голосов
/ 04 октября 2018

Вы не можете изменить оставшееся время на уже созданном CountDownTimer.

Если посмотреть на источник , то и millisInFuture, и countDownInterval назначены конечным переменным;Вы не можете их изменить.

Теперь переменная mStopTimeInFuture, которую таймер фактически использует для остановки, не является окончательной и может быть изменена.Но это частная переменная, означающая, что вам нужно использовать отражение, и она может не работать должным образом.

Если вам нужен изменяемый CountDownTimer, вам придется свернуть свой собственный (самый простой способ - этоскопируйте источник CountDownTimer и сделайте переменную mStopTimeInFuture общедоступной и добавьте к ней миллисекунды при необходимости).

...