我在手动管理暗模式时遇到了一个大问题。
在应用程序启动时,第一个活动会在 SharedPreferences 中检查用户是否选择启用深色模式或保持浅色模式(默认),然后根据用户首选项进行相应更改:
编辑:正如 CSmith 所要求的,这是在活动中调用主题选择器的时间
//FirstActivity
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AppThemeSelector.checkAndShowTheme(getApplicationContext());
...
Run Code Online (Sandbox Code Playgroud)
这是主题选择器方法
//AppThemeSelector.class
public static void checkAndShowTheme(Context context){
SharedPreferences sharedPreferences = context.getSharedPreferences(
PreferencesValues.SHARED_DARKMODE_MAP, Context.MODE_PRIVATE
);
boolean darkMode = sharedPreferences.getBoolean(PreferencesValues.SHARED_DARKMODE_ENABLED, false);
if(darkMode){
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
}else{
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
}
}
Run Code Online (Sandbox Code Playgroud)
到目前为止一切顺利,每当它启动时,它都会使用用户选择的主题设置主题,并且一切正常。
显然,这个问题似乎只发生在我的小米 Mi A2 Lite (Android 10) 上,因为我已经在 Pixel 2 (Android 11) 和模拟器 (Android 10) 上进行了测试,当应用程序从最近的应用程序恢复时,一切正常普通的。
重现我的问题的一致方法是:假设我的应用程序设置为手动灯光模式,而我的系统处于黑暗模式。我打开应用程序(留在家庭活动或去其他活动会导致相同的问题),然后进入系统设置并更改系统语言。
当我从最近的应用程序选项卡重新打开应用程序时,应用程序似乎尝试重新启动,但中途崩溃了(不确定这一点,因为 logcat 没有显示任何有关崩溃的信息,应用程序也没有显示有关崩溃的任何对话框),并且当它启动时,它会自动设置它的主题到系统主题(所以在我的示例中它进入黑暗模式)。
目前的问题是,一些本来应该在深色模式下看到的文本现在有了浅色模式主题,使它们与黑色背景融为一体;应用程序中用于从深色模式更改为浅色模式的开关保持正确的设置(显示未启用深色模式),但应用程序处于深色模式。如果应用程序重新启动,一切都会恢复正常,并且应用程序会正确显示在浅色主题中。
当应用程序长时间停留在后台时,我无法重现该问题,但我认为它也可能发生。