避免在暗色主题在应用外更改时重新创建活动。

3

当用户从通知菜单更改系统主题时,我的活动会重新创建并再次加载数据,这不是我的应用程序的要求。

有没有可能防止系统主题更改以这种方式影响我的应用程序?


1
"正在重新创建" -- 暗模式的更改是一种配置更改,旋转屏幕、在设置中更改语言环境、进入或退出分屏模式等也是如此。您的应用程序需要能够处理配置更改。请参阅文档 - CommonsWare
我已按照文档中所示实现了 onConfigurationChanged 方法。但它无法处理主题配置更改(在小米 8 上进行了测试)。 - prsnlme
请注意,只有在清单条目中具有android:configChanges,并且您尝试的特定配置更改在android:configChanges列表中时,才会调用onConfigurationChanged()。小米可能正在执行与标准Android不同的操作。 - CommonsWare
2个回答

3
不要停止主题更改,相反将数据存储在viewModels中。
ViewModel类旨在以生命周期感知的方式存储和管理与UI相关的数据。ViewModel类允许数据在配置更改(如屏幕旋转或主题更改)时保留。
请参考:viewModel

1
然而,我的主活动中有几个片段。我不应该让暗主题重新创建它,不仅仅是片段和DialogFragments。 - prsnlme

2

在清单文件中尝试下面的代码

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity"
    android:configChanges="uiMode"> //★★★★add this line★★★★

    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

Sources: https://proandroiddev.com/daynight-applying-dark-mode-without-recreating-your-app-c8a62d51092d


1
虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面更改,仅有链接的答案可能会失效。-【来自审查】 - Pawel Veselov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接