您好,我在手动管理暗模式时遇到了一个大问题,所以我会直接解决它:
该应用程序如何工作
在应用程序启动时,如果用户选择启用暗模式或保持亮模式(默认),第一个活动会检查 SharedPreferences,然后它会根据用户偏好进行相应的更改:
编辑:正如 CSmith 所要求的,这是在活动中调用主题选择器的时间
//FirstActivity
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AppThemeSelector.checkAndShowTheme(getApplicationContext());
...
这是主题选择器方法
//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);
}
}
到目前为止一切顺利,每当它启动时,它都会将其主题设置为用户选择的主题,并且一切正常。
问题发生在哪里
显然,这个问题似乎只发生在我的 Xiaomi Mi A2 lite (Android 10) 上,因为我已经在 Pixel 2 (Android 11) 和模拟器 (Android 10) 上进行了测试,当应用程序从最近的应用程序恢复时一切正常普通的。
问题
重现我的问题的一致方法是:假设我的应用程序设置为手动亮模式,并且我的系统处于暗模式。我打开应用程序(无论是呆在家里活动还是去另一个活动都会导致同样的问题),然后我进入系统设置并更改系统语言。当我从最近的应用程序选项卡重新打开应用程序时,它看起来应用程序试图重新启动,但它在中途崩溃(不确定,因为 logcat 没有显示任何有关崩溃的信息,应用程序也没有显示任何有关崩溃的对话框)并且当它启动时它会自动设置它的主题到系统主题(所以在我的例子中它进入暗模式)。
此时的问题是,一些原本应该在深色模式下看到的文本现在有了浅色模式主题,使它们与黑色背景融为一体;应用程序中用于从暗模式更改为亮模式的开关保持正确设置(显示未启用暗模式),但应用程序处于暗模式。如果重新启动应用程序,一切都会恢复正常,并且应用程序在浅色主题中正确显示。
当应用程序长时间处于后台时,我无法重现该问题,但我认为它也可能发生。
感谢您的时间!