2

您好,我在手动管理暗模式时遇到了一个大问题,所以我会直接解决它:

该应用程序如何工作

在应用程序启动时,如果用户选择启用暗模式或保持亮模式(默认),第一个活动会检查 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 没有显示任何有关崩溃的信息,应用程序也没有显示任何有关崩溃的对话框)并且当它启动时它会自动设置它的主题到系统主题(所以在我的例子中它进入暗模式)。

此时的问题是,一些原本应该在深色模式下看到的文本现在有了浅色模式主题,使它们与黑色背景融为一体;应用程序中用于从暗模式更改为亮模式的开关保持正确设置(显示未启用暗模式),但应用程序处于暗模式。如果重新启动应用程序,一切都会恢复正常,并且应用程序在浅色主题中正确显示。

当应用程序长时间处于后台时,我无法重现该问题,但我认为它也可能发生。

感谢您的时间!

4

3 回答 3

2

AppCompatDelegate.setDefaultNightMode()可能会导致重新创建活动,我通常执行一次此检查并在Application类覆盖中执行此操作。

请尝试将您的调用转移checkAndShowTheme()onCreate应用程序类覆盖的方法

public class MyApplication extends Application
{
    @Override
    public void onCreate()
    {
        super.onCreate();
        AppThemeSelector.checkAndShowTheme(getApplicationContext());
    }
}

这种方式setDefaultNightMode()在应用程序生命周期的早期就被调用一次。

老实说,我不确定为什么小米米 A2 表现出不同的行为,我只是提出一种我已经成功遵循的做法,希望它对你有所帮助。

于 2021-06-07T12:07:37.237 回答
1

我认为您的问题很可能是因为 Andriod Q 及更高版本中的强制暗模式。MIUI 以一种奇怪的方式实现了它,它将每个应用程序转换为暗模式。你应该在你的轻主题样式文件中使用它

<item name="android:forceDarkAllowed" tools:targetApi="q">false</item>
于 2021-06-03T18:15:18.030 回答
0

利用

android:configChanges="uiMode" 

在这样的清单活动标签中:

<activity
android:name=".MyActivity"
android:configChanges="uiMode" />
于 2021-08-17T09:01:00.793 回答