应用程序恢复/重启时的Android手动暗模式导致应用程序主题无法正常工作
您好,我在手动管理暗模式时遇到了一个大问题,因此我将立即开始: 这个应用程序是如何工作的 在应用程序启动时,如果用户选择启用暗模式或保持亮模式(默认),则第一个活动将检查SharedReferences,然后根据用户首选项相应地更改它: 编辑:正如CSmith所要求的,这里是在活动中调用主题选择器的时间应用程序恢复/重启时的Android手动暗模式导致应用程序主题无法正常工作,android,android-theme,android-dark-theme,android-darkmode,Android,Android Theme,Android Dark Theme,Android Darkmode,您好,我在手动管理暗模式时遇到了一个大问题,因此我将立即开始: 这个应用程序是如何工作的 在应用程序启动时,如果用户选择启用暗模式或保持亮模式(默认),则第一个活动将检查SharedReferences,然后根据用户首选项相应地更改它: 编辑:正如CSmith所要求的,这里是在活动中调用主题选择器的时间 //FirstActivity @Override protected void onCreate(Bundle savedInstanceState) { su
//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)和emulator(Android 10)上进行了测试,当应用程序从最近的应用程序恢复时,一切正常
问题
复制我的问题的一致方法是:
假设我的应用程序设置为手动照明模式,而我的系统处于暗模式。我打开应用程序(无论是呆在家里还是去另一个活动都会导致同样的问题),然后进入系统设置并更改系统语言。
当我从“最近的应用程序”选项卡重新打开应用程序时,它看起来像是应用程序试图重新启动,但中途崩溃(不确定这一点,因为logcat没有显示任何关于崩溃的信息,应用程序也没有显示任何关于崩溃的对话框),当它启动时,它会自动将其主题设置为系统主题(因此在我的示例中,它会进入暗模式)
这一点上的问题是,一些原本应该在黑暗模式下看到的文本现在有了光明模式主题,使它们与黑色背景混合;应用程序中用于从暗模式切换到亮模式的开关保持正确设置(显示暗模式未启用),但应用程序处于暗模式。如果重新启动应用程序,一切将恢复正常,应用程序将正确显示在灯光主题中
当应用程序在后台停留很长时间时,我无法重现这个问题,但我认为它也可能发生
谢谢你抽出时间 我认为您的问题很可能是因为Andriod Q和更高版本中的强制暗模式。MIUI以某种奇怪的方式实现了它,它在黑暗模式下转换每个应用程序。您应该在灯光主题样式文件中使用此选项
<item name="android:forceDarkAllowed" tools:targetApi="q">false</item>
false
我认为您的问题最有可能是因为Andriod Q和更高版本中的强制暗模式。MIUI以某种奇怪的方式实现了它,它在黑暗模式下转换每个应用程序。您应该在灯光主题样式文件中使用此选项
<item name="android:forceDarkAllowed" tools:targetApi="q">false</item>
false
AppCompatDelegate.setDefaultNightMode()
可能会导致重新创建活动,我通常在应用程序中执行一次此检查
请尝试将对checkAndShowTheme()
的调用移动到应用程序类重写的onCreate
方法
public class MyApplication extends Application
{
@Override
public void onCreate()
{
super.onCreate();
AppThemeSelector.checkAndShowTheme(getApplicationContext());
}
}
这样在应用程序生命周期的早期调用一次setDefaultNightMode()
老实说,我不知道为什么小米米A2表现出不同的行为,我只是建议一种我已经成功遵循的实践,并希望它能帮助您。AppCompatDelegate.setDefaultNightMode()
可以导致活动被重新创建,我通常执行此检查一次,并在应用程序中执行此检查
请尝试将对checkAndShowTheme()
的调用移动到应用程序类重写的onCreate
方法
public class MyApplication extends Application
{
@Override
public void onCreate()
{
super.onCreate();
AppThemeSelector.checkAndShowTheme(getApplicationContext());
}
}
这样在应用程序生命周期的早期调用一次setDefaultNightMode()
老实说,我不知道为什么小米A2表现出不同的行为,我只是建议我遵循一种成功的做法,希望它能帮助您。我的Mi A2 Lite不使用MIUI,但我已经尝试了您的修复程序,不幸的是它似乎没有任何作用。我的Mi A2 Lite不使用MIUI,但我已经尝试了您的修复程序,不幸的是它似乎没有任何作用。您可以显示您在启动活动中检查共享引用的位置吗调用setDefaultNightMode
API?当然!我刚刚更新了main post@csmith请尝试将checkAndShowTheme()
调用移动到应用程序
类重写及其onCreate()
方法(请参阅)?还要在checkAndShowTheme()
中添加一些日志记录,以显示调用它的时间,并确认从SharedReferences
读取的值。我已经有一个管理数据库的应用程序类,并且您的逻辑是正确的。将检查放入应用程序类后,记录checkAndShowTheme()
方法的值总是记录正确的值,问题似乎得到了解决。我不能百分之百确定这个问题是否消失了,因为昨天重新启动手机后,在更改代码之前,我再也没有发现这个问题了。不管怎么说,目前你的解决方案没有问题,所以我想把你的答案标记为接受。如果你觉得可以的话,写一篇文章,我会记下来。感谢您的时间@csmithc您可以显示您在启动活动中检查SharedReferences
并调用setDefaultNightMode
API的位置吗?当然可以!我刚刚更新了main post@csmith请尝试将checkAndShowTheme()
调用移动到应用程序
类重写及其onCreate()
方法(请参阅)?还要在checkAndShowTheme()
中添加一些日志记录,以显示调用它的时间,并确认从SharedReferences
读取的值。我已经有一个管理数据库的应用程序类,并且您的逻辑是正确的。将检查放入应用程序类后,记录checkAndShowTheme()方法的值总是记录正确的值和