Android Kotlin CountDown计时器用于添加时间

时间:2018-10-04 13:15:52

标签: android kotlin countdowntimer

在计时器中,我使用如何添加按下按钮的时间?例如,当我按下按钮时,我希望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()

4 个答案:

答案 0 :(得分:1)

正如@TheWanderer回答的那样,您无法更新millisUntilFinished,因为CountDownTimer类中没有这样的方法。

要更新计时器,您需要停止当前计时器并使用更新的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
        }
    }

答案 1 :(得分:1)

这是我们使用的倒数计时器

    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()
        }

科特琳抱怨这不确定原因

答案 2 :(得分:1)

除了 Vector 的回答之外,我还制作了一个按钮,每 1 秒显示一次倒数计时器。我将 Vector 的答案放入一个函数中,然后在按下按钮时调用它。希望这有助于某人。在这个例子中,它从 4 秒开始倒计时。

private fun countdown(){
    object : CountDownTimer(4000, 1000) {
        override fun onTick(millisUntilFinished: Long) {

            otp_resend.text = (millisUntilFinished / 1000).toString()
        }
        override fun onFinish() {
            // do something after countdown is done ie. enable button, change color 
               etc.
             otp_resend.text = "done!"
        }
    }.start()
}

答案 3 :(得分:0)

您无法在已创建的CountDownTimer上更改剩余时间。

Looking at the sourcemillisInFuturecountDownInterval都分配给最终变量;您无法更改它们。

现在,mStopTimeInFuture变量(计时器实际用于停止的变量)不是最终变量,可以更改。但这是一个私有变量,这意味着您需要使用反射,并且可能无法正常工作。

如果您想要一个可变的CountDownTimer,则需要自己滚动(最简单的方法可能是复制CountDownTimer源并将mStopTimeInFuture变量公开,并在需要时向其添加毫秒)。