您好,我在手动管理暗模式时遇到了一个大问题,所以我会马上解决:
在应用程序启动时,第一个 Activity 在 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);
}
}
到目前为止一切顺利,无论何时启动,它都会将主题设置为用户选择的主题,并且一切正常。
显然这个问题似乎只发生在我的小米 A2 lite (Android 10) 上,因为我已经在 Pixel 2 (Android 11) 和模拟器 (Android 10) 上进行了测试,并且当应用程序从最近的版本中恢复时应用一切正常。
重现我的问题的一致方法是: 假设我的应用程序设置为手动模式,而我的系统处于暗模式。我打开应用程序(留在家里活动或去其他活动会导致同样的问题)然后我进入系统设置并更改系统语言。 当我从最近的应用程序选项卡重新打开应用程序时,它看起来像是应用程序尝试重新启动,但它在中途崩溃(不确定,因为 logcat 没有显示任何有关崩溃的信息,应用程序也没有显示任何有关崩溃的对话框),并且当它启动时它会自动设置它的主题是系统主题(所以在我的例子中它进入黑暗模式)。
此时的问题是,一些原本应该在暗模式下看到的文本现在有了亮模式主题,使它们与黑色背景融为一体;应用程序中用于从暗模式更改为亮模式的开关保持正确设置(显示未启用暗模式),但应用处于暗模式。如果应用重新启动,一切都会恢复正常,并且应用以浅色主题正确显示。
当应用长时间处于后台时,我无法重现该问题,但我认为它也可能发生。
感谢您的宝贵时间!
答案 0 :(得分:1)
我认为您的问题很可能是因为 Andriod Q 及更高版本中的强制暗模式。 MIUI 以某种奇怪的方式实现了它,它可以在黑暗模式下转换每个应用程序。你应该在你的灯光主题样式文件中使用它
<item name="android:forceDarkAllowed" tools:targetApi="q">false</item>
答案 1 :(得分:1)
AppCompatDelegate.setDefaultNightMode()
可能导致重新创建 Activity,我通常会执行一次此检查,并在 Application
类覆盖中执行此操作。
请尝试将您对 checkAndShowTheme()
的调用移至应用程序类覆盖的 onCreate
方法
public class MyApplication extends Application
{
@Override
public void onCreate()
{
super.onCreate();
AppThemeSelector.checkAndShowTheme(getApplicationContext());
}
}
通过这种方式,setDefaultNightMode()
在应用程序生命周期的早期被调用一次。
老实说我不知道为什么小米A2表现出不同的行为,我只是建议一个我成功遵循的做法,希望它可以帮助你。