重新创建后出现DayNight模式状态栏/控件主题不一致的问题

时间:2018-10-29 08:51:22

标签: android android-theme

在更改首选项和调用activity.recreate()之后,让DayNight主题正常播放时,我遇到了很多麻烦。根据值(以及我使用的是哪个SDK),我的主题不一致(图标在暗处为暗,在亮处为亮)。

在我的PreferenceFragment中,我有一个首选项,允许用户设置以下三个值之一:Light,Dark或Auto,分别与AppCompatDelegates MODE_NIGHT_NO,MODE_NIGHT_YES或MODE_NIGHT_AUTO相对应。这是实现的样子:

PreferenceFragment.kt

override fun onPreferenceChange(preference: Preference, value: Any): Boolean {
    setSummary(preference, value.toString())

    return when (preference.key) {
        themePreference.key -> consume {
            AppCompatDelegate.setDefaultNightMode(appSharedPreferences.string(R.string.preference_theme_key).toInt())
            activity?.recreate()
        }
    }
}

BaseActivity.kt

 override fun onCreate(savedInstanceState: Bundle?) {
    AppCompatDelegate.setDefaultNightMode(appSharedPreferences.string(R.string.preference_theme_key).toInt())

    super.onCreate(savedInstanceState)
}

我也尝试过以下组合:

delegate.setLocalNightMode(appSharedPreferences.string(R.string.preference_theme_key).toInt())

AppCompatDelegate.setDefaultNightMode(appSharedPreferences.string(R.string.preference_theme_key).toInt()

陷入活动/应用程序生命周期的不同位置,没有成功。

我主要看到的是黑色状态栏中的黑色图标,以及pre-P应用程序切换器上的不一致(主题为Night,但应用程序切换器工具栏显示为浅色主题)。我似乎没有自己的应用程序控件(例如选项卡或文本)主题的问题,它主要在android系统视图(如状态栏和应用程序切换器工具栏)上显示。

如果我终止了该应用程序并重新启动,则没有任何问题。只有在Activity.recreate调用之后,我才能看到这些问题。

1 个答案:

答案 0 :(得分:1)

搜索了很长时间的简单解决方案后,我发现了一个可以方便地处理这种情况的属性。我不确定这种方法的正确性,但是从我的测试来看,它是否按预期工作。

鉴于您在样式XML中使用Theme.MaterialComponents.DayNight或类似的变体,则可以将?attr/isLightTheme用作true / false标志。

<item name="android:windowLightStatusBar">?attr/isLightTheme</item>

?attr/isLightTheme返回的值由系统处理。您可以使用以下方法检查当前值:

AppCompatDelegate.getDefaultNightMode();

// or

Configuration configuration = getResources().getConfiguration();
int currentNightMode = configuration.uiMode & Configuration.UI_MODE_NIGHT_MASK;