重新创建后 DayNight 模式状态 bar/controls 主题不一致的问题

Trouble with DayNight mode status bar/controls inconsistently themed after recreate

在更改首选项和 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()

在 activity/application 生命周期中的不同地方撒布,但没有成功。

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

如果我终止应用程序并重新启动,我不会有任何问题。只有在 activity.recreate 调用后我才看到这些问题。

找了好久的简单解决方案后,我找到了一个可以方便处理这种情况的属性。我不确定这种方法是否合适,但根据我的测试,它按预期工作。

鉴于您在风格 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;