android - 如何实现从一个到另一个android的一周变化
问题描述
面对这样的任务:我正在为一所大学制作一个应用程序,每周(从星期一 00:00 开始)都有自己的名字:分子和分母。假设当前周是分子,下一周是分母,然后是分子,依此类推。
我不明白如何每周在我的片段上显示类型(分子或分母),好吧,最好在周日的 00:00 将一周分别更改为分子或分母。我正在使用 Kotlin
解决方案
我会在 ViewModel 中执行此操作。公开一个带有布尔值的 LiveData,其中 true/false 对应于分子周或分母周。选择一个任意的星期一日期作为计算当前日期的基准。我任意使用本周的星期一作为这个基线时期。
然而,这种方法假设大学的日历永远不会打破这种模式。如果它们的模式不一致,您将需要一个数据表来查找要使用的值。
class MyViewModel : ViewModel() {
companion object {
private val WEEK_TYPE_BASELINE_DAY = LocalDate.of(2021, 11, 1)
}
private val mutableWeekType = MutableLiveData<Boolean>()
val weekType: LiveData<Boolean> get() = mutableWeekType
init {
updateCurrentWeekType()
}
private fun updateCurrentWeekType() {
val today = LocalDate.now()
val weeks = ChronoUnit.WEEKS.between(WEEK_TYPE_BASELINE_DAY, today)
mutableWeekType.value = weeks % 2 == 0L
// In case week changes while this ViewModel is alive, queue next update.
val nextMonday = today.with(TemporalAdjusters.next(DayOfWeek.MONDAY))
val nextMondayMidnight = LocalDateTime.of(nextMonday, LocalTime.MIDNIGHT)
viewModelScope.launch {
delay(ChronoUnit.MILLIS.between(LocalDateTime.now(), nextMondayMidnight))
updateCurrentWeekType()
}
}
}
weekType
Fragment 可以根据接收到的真假来观察和修改任何 UI 元素的文本。
我想要真正正确地做到这一点,android.intent.action.TIMEZONE_CHANGED
如果时区发生变化,您还应该注册一个 BroadcastReceiver 并调用更新函数。
推荐阅读
- go - 尝试在电子表格上执行 BatchUpdate 请求时获取“未定义:sheets.DeleteSheet”
- python - 可以存储在内存中的函数
- node.js - Node.js 套接字挂断了 http.get 但不是请求模块
- scala - SparkML - 创建 RandomForestRegressionModel 的 df(feature, feature_importance)
- java - 昙花一现的春云流
- laravel - 未定义的变量:toemail Laravel 邮件问题
- excel - Excel - 从多个范围过滤行
- elasticsearch - Elasticsearch - 计算子范围聚合
- javascript - 在 Postman 中将字段添加到 json
- vue.js - V-for="项目中的项目"。在计算属性中使用“项目”