我正在使用 Kotlin 开发 Android 应用程序,希望允许用户在浅色和深色主题之间实时切换,而无需重新启动应用程序。我尝试过使用 AppCompatDelegate.setDefaultNightMode() 方法,但主题不会立即在所有屏幕上更新。
这是我到目前为止所做的:
但是,仅刷新当前屏幕,导航到其他屏幕不会立即应用主题。有没有一种方法可以实现整个应用程序的实时主题切换而无需重新启动?我应该使用 LiveData、ViewModel 还是其他东西来观察全局主题变化?
我希望主题在切换后立即应用于整个应用程序,而不需要重新启动或导航回主屏幕。
这是我用来根据用户选择更改主题的实用程序类。
object ThemeHelper {
private const val TAG: String = "ThemeHelper"
var currentTheme: String? = null
fun applyTheme(activity: Activity?) {
val sessionManager = SessionManager(activity)
val theme: String = sessionManager.getStringValue(Const.THEME_KEY)
Log.d(TAG, "applyTheme: theme = $theme")
if (theme != currentTheme) {
when (theme) {
Const.THEME_LIGHT -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
Const.THEME_DARK -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
Const.THEME_SYSTEM -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
else -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
}
currentTheme = theme
val delegate = AppCompatDelegate.create(activity!!, null)
delegate.applyDayNight()
}
}
}
希望对你有帮助。