使用 for-loop Android Kotlin 创建多个倒数计时器
Creating multiple countdown timers with a for-loop Android Kotlin
我目前在使用 Kotlin 的 CountDownTimer 时遇到问题。
我正在尝试实现一个计时器,它从 45 秒开始倒计时,然后从 30 秒开始倒计时指定的次数。
实际发生的是 for 循环经历所有迭代,当它到达最后一次迭代时,它启动计时器并且只运行一次。
我认为这可能是线程引起的,但我不是 100% 确定,也没有找到与此相关的任何内容,所以我可能是错的。
我看到了几个类似的问题,但都没有有效的答案:
- countdown timer loop android
- How to loop countdown timer multiple times
这里是 class:
import android.os.Bundle
import android.os.CountDownTimer
import com.google.android.material.snackbar.Snackbar
import androidx.appcompat.app.AppCompatActivity
import ee.shanel.hiittimer.timer.HiitData
import ee.shanel.hiittimer.timer.Workout
import ee.shanel.hiittimer.timer.WorkoutSet
import kotlinx.android.synthetic.main.activity_timer.*
import kotlinx.android.synthetic.main.content_timer.*
class TimerActivity : AppCompatActivity() {
private var previousTimerActive = false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_timer)
setSupportActionBar(toolbar)
fab.setOnClickListener { view ->
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show()
val workoutSets = calclateTimer()
for (workoutSet in workoutSets) {
startWorkout(workoutSet)
}
}
}
private fun startWorkout(workoutSet: WorkoutSet) {
timerStatusText.setText("Go")
timerStatusText.setText(workoutSet.status)
object : CountDownTimer(workoutSet.secs, 1000) {
override fun onTick(millisUntilFinished: Long) {
val minutesRemaining = millisUntilFinished / 60000
val secondsRemaining = (millisUntilFinished % 60000) / 1000
val minutes = appendZero(minutesRemaining)
val seconds = appendZero(secondsRemaining)
val timerText = "${minutes} : ${seconds}"
timer.setText(timerText)
}
override fun onFinish() {
}
}.start()
}
private fun calclateTimer(): ArrayList<WorkoutSet> {
val hiitData = getIntent().getExtras().getParcelable<HiitData>("hiitData")
val workout: ArrayList<WorkoutSet> = ArrayList()
for (i in 0..hiitData.sets) {
val work = WorkoutSet("Workout", (hiitData.workoutSecs * 1000).toLong())
val rest = WorkoutSet("Rest", (hiitData.restSecs * 1000).toLong())
workout.add(work)
if (i != hiitData.sets) {
workout.add(rest)
}
}
return workout
}
private fun appendZero(time: Long): String {
val timeString = time.toString()
return if (time < 10) "0$timeString" else timeString
}
}
在此先感谢您提供的任何帮助。
当你开始的时候,你应该拿第一个。
fab.setOnClickListener { view ->
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show()
val workoutSets = calclateTimer()
workoutSet = workoutSets.get(0)
startWorkout(workoutSet)
}
然后你可以,例如,删除它,然后再拿第一个。
private fun startWorkout(workoutSet: WorkoutSet) {
timerStatusText.setText("Go")
timerStatusText.setText(workoutSet.status)
object : CountDownTimer(workoutSet.secs, 1000) {
override fun onTick(millisUntilFinished: Long) {
val minutesRemaining = millisUntilFinished / 60000
val secondsRemaining = (millisUntilFinished % 60000) / 1000
val minutes = appendZero(minutesRemaining)
val seconds = appendZero(secondsRemaining)
val timerText = "${minutes} : ${seconds}"
timer.setText(timerText)
}
override fun onFinish() {
workoutSets.remove(workoutSet)
workoutSet = workoutSets.get(0)
startWorkout(workoutSet)
}
}.start()
}
也可以选择不删除它而只取第二个,但这需要更改 startWorkout(workoutSet: WorkoutSet)
函数以便也传递列表的索引。
我目前在使用 Kotlin 的 CountDownTimer 时遇到问题。
我正在尝试实现一个计时器,它从 45 秒开始倒计时,然后从 30 秒开始倒计时指定的次数。
实际发生的是 for 循环经历所有迭代,当它到达最后一次迭代时,它启动计时器并且只运行一次。
我认为这可能是线程引起的,但我不是 100% 确定,也没有找到与此相关的任何内容,所以我可能是错的。
我看到了几个类似的问题,但都没有有效的答案:
- countdown timer loop android
- How to loop countdown timer multiple times
这里是 class:
import android.os.Bundle
import android.os.CountDownTimer
import com.google.android.material.snackbar.Snackbar
import androidx.appcompat.app.AppCompatActivity
import ee.shanel.hiittimer.timer.HiitData
import ee.shanel.hiittimer.timer.Workout
import ee.shanel.hiittimer.timer.WorkoutSet
import kotlinx.android.synthetic.main.activity_timer.*
import kotlinx.android.synthetic.main.content_timer.*
class TimerActivity : AppCompatActivity() {
private var previousTimerActive = false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_timer)
setSupportActionBar(toolbar)
fab.setOnClickListener { view ->
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show()
val workoutSets = calclateTimer()
for (workoutSet in workoutSets) {
startWorkout(workoutSet)
}
}
}
private fun startWorkout(workoutSet: WorkoutSet) {
timerStatusText.setText("Go")
timerStatusText.setText(workoutSet.status)
object : CountDownTimer(workoutSet.secs, 1000) {
override fun onTick(millisUntilFinished: Long) {
val minutesRemaining = millisUntilFinished / 60000
val secondsRemaining = (millisUntilFinished % 60000) / 1000
val minutes = appendZero(minutesRemaining)
val seconds = appendZero(secondsRemaining)
val timerText = "${minutes} : ${seconds}"
timer.setText(timerText)
}
override fun onFinish() {
}
}.start()
}
private fun calclateTimer(): ArrayList<WorkoutSet> {
val hiitData = getIntent().getExtras().getParcelable<HiitData>("hiitData")
val workout: ArrayList<WorkoutSet> = ArrayList()
for (i in 0..hiitData.sets) {
val work = WorkoutSet("Workout", (hiitData.workoutSecs * 1000).toLong())
val rest = WorkoutSet("Rest", (hiitData.restSecs * 1000).toLong())
workout.add(work)
if (i != hiitData.sets) {
workout.add(rest)
}
}
return workout
}
private fun appendZero(time: Long): String {
val timeString = time.toString()
return if (time < 10) "0$timeString" else timeString
}
}
在此先感谢您提供的任何帮助。
当你开始的时候,你应该拿第一个。
fab.setOnClickListener { view ->
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show()
val workoutSets = calclateTimer()
workoutSet = workoutSets.get(0)
startWorkout(workoutSet)
}
然后你可以,例如,删除它,然后再拿第一个。
private fun startWorkout(workoutSet: WorkoutSet) {
timerStatusText.setText("Go")
timerStatusText.setText(workoutSet.status)
object : CountDownTimer(workoutSet.secs, 1000) {
override fun onTick(millisUntilFinished: Long) {
val minutesRemaining = millisUntilFinished / 60000
val secondsRemaining = (millisUntilFinished % 60000) / 1000
val minutes = appendZero(minutesRemaining)
val seconds = appendZero(secondsRemaining)
val timerText = "${minutes} : ${seconds}"
timer.setText(timerText)
}
override fun onFinish() {
workoutSets.remove(workoutSet)
workoutSet = workoutSets.get(0)
startWorkout(workoutSet)
}
}.start()
}
也可以选择不删除它而只取第二个,但这需要更改 startWorkout(workoutSet: WorkoutSet)
函数以便也传递列表的索引。