在更改首选项和调用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调用之后,我才能看到这些问题。
答案 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;