您好,我有一个很大的问题,手动管理黑暗模式,所以我将直接进入它:
这个应用程序是如何工作的
在应用程序启动时,第一个活动检查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精简版(安卓10)上,因为我已经在Pixel2(安卓11)和模拟器(安卓10)上进行了测试,当应用程序从最近的应用程序中恢复时,一切正常。
问题所在
重现我的问题的一种一致的方法是:假设我的应用程序设置为手动亮模式,而我的系统处于暗模式。我打开应用程序(无论是待在家里的活动中还是转到另一个活动中都会导致相同的问题),然后我进入系统设置并更改系统语言。当我从最近的应用程序选项卡中重新打开应用程序时,它看起来像是试图重新启动,但在中途崩溃(不确定,因为logcat没有显示任何关于崩溃的内容,也没有显示任何关于崩溃的对话框),当它启动时,它会自动将其主题设置为系统主题(所以在我的示例中,它会进入暗模式)。
在这一点上的问题是,一些原本应该在暗模式下看到的文本现在有了亮模式主题,使它们与黑色背景混合在一起;应用程序中用于从暗模式切换到亮模式的开关保持在正确的设置上(显示暗模式未启用),但应用程序处于暗模式。如果应用程序重新启动,一切都会恢复正常,并且应用程序会正确地显示在轻主题中。
当应用程序在后台停留很长一段时间时,我无法重现这个问题,但我认为它也可能发生。
谢谢您抽时间见我!
发布于 2021-06-07 20:07:37
AppCompatDelegate.setDefaultNightMode()可能会导致重新创建活动,我通常只执行一次此检查,并在Application类覆盖中执行此操作。
请尝试将对checkAndShowTheme()的调用移动到应用程序类重写的onCreate方法
public class MyApplication extends Application
{
@Override
public void onCreate()
{
super.onCreate();
AppThemeSelector.checkAndShowTheme(getApplicationContext());
}
}这样,setDefaultNightMode()在应用程序生命周期的早期就会被调用一次。
老实说,我不确定为什么小米A2表现出不同的行为,我只是建议一个我已经成功遵循的做法,并希望它能帮助你。
发布于 2021-06-04 02:15:18
我认为你的问题很可能是因为Andriod Q和更高版本中的强制暗模式。MIUI以一种奇怪的方式实现了它,它将每个应用程序转换为暗模式。您应该在轻量主题样式文件中使用它
<item name="android:forceDarkAllowed" tools:targetApi="q">false</item>发布于 2021-08-17 09:01:01
使用
android:configChanges="uiMode" 在清单活动标签中,如下所示:
<activity
android:name=".MyActivity"
android:configChanges="uiMode" />https://stackoverflow.com/questions/67825832
复制相似问题