如何使用Kotlin在Android中实现实时主题切换?

问题描述 投票:0回答:1

我正在使用 Kotlin 开发 Android 应用程序,希望允许用户在浅色和深色主题之间实时切换,而无需重新启动应用程序。我尝试过使用 AppCompatDelegate.setDefaultNightMode() 方法,但主题不会立即在所有屏幕上更新。

这是我到目前为止所做的:

  1. 在应用程序的设置屏幕中添加了一个开关,用于切换主题。
  2. 使用 AppCompatDelegate.setDefaultNightMode() 根据开关的状态应用主题。

但是,仅刷新当前屏幕,导航到其他屏幕不会立即应用主题。有没有一种方法可以实现整个应用程序的实时主题切换而无需重新启动?我应该使用 LiveData、ViewModel 还是其他东西来观察全局主题变化?

我希望主题在切换后立即应用于整个应用程序,而不需要重新启动或导航回主屏幕。

android themes android-theme
1个回答
0
投票

这是我用来根据用户选择更改主题的实用程序类。

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()
        }
    }
}

希望对你有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.