在切换到黑暗/夜间主题之前,活动快速闪烁白色

Jim*_*nts 7 android kotlin

我在我的应用程序中实现了黑暗/夜间模式切换,我从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 尚未初始化。

Shl*_*iel 1

请尝试以下操作:

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在处理用户选择时在设置上调用它。