首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >应用恢复/重启时Android手动暗模式导致应用主题不能正常工作

应用恢复/重启时Android手动暗模式导致应用主题不能正常工作
EN

Stack Overflow用户
提问于 2021-06-04 01:10:26
回答 3查看 570关注 0票数 1

您好,我有一个很大的问题,手动管理黑暗模式,所以我将直接进入它:

这个应用程序是如何工作的

在应用程序启动时,第一个活动检查SharedPreferences,如果用户选择启用暗模式或保持亮模式(默认),则它会根据用户偏好进行相应的更改:

编辑:按CSmith请求这里是在活动中调用主题选择器的时候

代码语言:javascript
复制
//FirstActivity
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        AppThemeSelector.checkAndShowTheme(getApplicationContext());
...

下面是主题选择器方法

代码语言:javascript
复制
//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没有显示任何关于崩溃的内容,也没有显示任何关于崩溃的对话框),当它启动时,它会自动将其主题设置为系统主题(所以在我的示例中,它会进入暗模式)。

在这一点上的问题是,一些原本应该在暗模式下看到的文本现在有了亮模式主题,使它们与黑色背景混合在一起;应用程序中用于从暗模式切换到亮模式的开关保持在正确的设置上(显示暗模式未启用),但应用程序处于暗模式。如果应用程序重新启动,一切都会恢复正常,并且应用程序会正确地显示在轻主题中。

当应用程序在后台停留很长一段时间时,我无法重现这个问题,但我认为它也可能发生。

谢谢您抽时间见我!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-06-07 20:07:37

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

请尝试将对checkAndShowTheme()的调用移动到应用程序类重写的onCreate方法

代码语言:javascript
复制
public class MyApplication extends Application
{
    @Override
    public void onCreate()
    {
        super.onCreate();
        AppThemeSelector.checkAndShowTheme(getApplicationContext());
    }
}

这样,setDefaultNightMode()在应用程序生命周期的早期就会被调用一次。

老实说,我不确定为什么小米A2表现出不同的行为,我只是建议一个我已经成功遵循的做法,并希望它能帮助你。

票数 1
EN

Stack Overflow用户

发布于 2021-06-04 02:15:18

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

代码语言:javascript
复制
<item name="android:forceDarkAllowed" tools:targetApi="q">false</item>
票数 1
EN

Stack Overflow用户

发布于 2021-08-17 09:01:01

使用

代码语言:javascript
复制
android:configChanges="uiMode" 

在清单活动标签中,如下所示:

代码语言:javascript
复制
<activity
android:name=".MyActivity"
android:configChanges="uiMode" />
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67825832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档