Как сделать секундомер с handler на Kotlin
В процессе написания приложения "секундомер" на Kotlin, столкнулся с вопросом, как правильно использовать Handler на Kotlin. Мои варианты использования к успеху не привели, и самостоятельно разобраться с ошибкой не могу. Суть приложения в том, что при нажатии на кнопку play, запускается секундомер, т.е. начинает работать handler, но этого не происходит.
Вариант 1:
private fun runTimer(){
Handler().postDelayed({ var hours: Int = sec / 3600
var minutes: Int = (sec % 3600) / 60
var secs: Int = sec % 60
var time: String = String.format(Locale.getDefault(),
"%02d:%02d:%02d", hours, minutes, secs)
textViewTimer.text = time
if (isRunning) { //При нажатии на кнопку "Play" переменной isRunning
sec++ //присвается значение "true" и секунды должны увеличиваться
}}, 1000)
}
Вариант 2:
private fun runTimer(){
var handler = Handler()
var runnable: Runnable = Runnable {
var hours: Int = sec / 3600
var minutes: Int = (sec % 3600) / 60
var secs: Int = sec % 60
var time: String = String.format("%02d:%02d:%02d", hours, minutes, secs)
textViewTimer.text = time
if (isRunning) {//При нажатии на кнопку "Play" переменной isRunning
sec++ //присвается значение "true" и секунды должны увеличиваться
}
}
handler.postDelayed(runnable, 1000)
}
Подскажите, пожалуйста, в чем моя ошибка.
Ответы (1 шт):
Вообще в kotlin насколько я знаю есть функция для решения данного вопроса:
val timer = object: CountDownTimer(20000, 1000) {
override fun onTick(millisUntilFinished: Long) {...}
override fun onFinish() {...}
}
timer.start()
Либо второй вариант - сделать все через вьюшки созданные как раз для этого:
<Chronometer
android:id="@+id/c_meter"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="20dp"
android:layout_marginStart="68dp"
android:layout_marginTop="256dp"
android:layout_marginEnd="68dp"
android:layout_marginBottom="28dp"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
android:textColor="#092FEC"
android:textSize="36sp"
app:layout_constraintBottom_toTopOf="@+id/btn"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
и дальше из активности:
val meter = findViewById<Chronometer>(R.id.c_meter)
meter.start() // meter.stop()
Вот есть туториал как сделать секундомер. И вот есть обсуждения как сделать на котлин.