重新创建后 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;
在更改首选项和 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;