我在我的应用程序中实现了黑暗/夜间模式切换,我从Google I/O App复制了该实现。
我创建了一个可以包含在 ViewModel 中的ThemedActivityDelegate 。实际更改为亮或暗是使用扩展函数完成的:updateForTheme。
但我看到SettingsActivity白色短暂闪烁,然后变成黑色。虽然我updateForTheme之前把方法放了setContentView。
主要活动:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
viewModel = ViewModelProvider(this, viewModelFactory).get(MainViewModel::class.java)
updateForTheme(viewModel.currentTheme)
lifecycleScope.launch {
lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {
launch {
viewModel.theme.collect { theme ->
updateForTheme(theme)
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
扩展.kt:
fun AppCompatActivity.updateForTheme(theme: Theme) = when (theme) {
Theme.DARK -> delegate.localNightMode = AppCompatDelegate.MODE_NIGHT_YES
Theme.LIGHT -> delegate.localNightMode = AppCompatDelegate.MODE_NIGHT_NO
Theme.SYSTEM -> delegate.localNightMode = AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM
Theme.BATTERY_SAVER -> delegate.localNightMode = AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY
}
Run Code Online (Sandbox Code Playgroud)
设置活动:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
updateForTheme(Theme.DARK)
setContentView(R.layout.activity_settings)
}
Run Code Online (Sandbox Code Playgroud)
更新:当我updateForTheme(viewModel.currentTheme)之前调用super.onCreate(savedInstanceState)时,它可以工作,但 Dagger 尚未初始化。
请尝试以下操作:
fun AppCompatActivity.updateForTheme(theme: Theme) {
val mode = when (theme) {
Theme.DARK -> AppCompatDelegate.MODE_NIGHT_YES
Theme.LIGHT -> AppCompatDelegate.MODE_NIGHT_NO
Theme.SYSTEM -> AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM
Theme.BATTERY_SAVER -> AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY
else -> AppCompatDelegate.MODE_NIGHT_UNSPECIFIED
}
if (mode != AppCompatDelegate.MODE_NIGHT_UNSPECIFIED) {
AppCompatDelegate.setDefaultNightMode(mode)
}
}
Run Code Online (Sandbox Code Playgroud)
对我来说效果很好: https: //github.com/shlomikatriel/BucksBunny
您可以setDefaultNightMode在处理用户选择时在设置上调用它。
| 归档时间: |
|
| 查看次数: |
812 次 |
| 最近记录: |