当我在 PreferenceScreen 中切换夜间模式时,我之前的屏幕不会触发 onRestart

问题描述

所以我的 SettingsActivity 带有 PreferenceScreen,因此我可以选择我的主题/字体设置以及夜间模式切换。

我有我的主题加载函数,我在每个活动的 onCreate 开始时调用它。 因为在我们更改设置之前可能会创建一个活动,所以我在 onRestart 中放置了一个 recreate() 以便在重新创建活动时我的函数会 loadTheme()。

问题是,在每次更改设置时,当我从 MainActivity 移动到 SettingsActivity 并更改首选项设置时,onStop() 被调用,在我从 SettingActivity 返回到 MainActivity 后,onRestart() 被调用为应该是。

我的问题是,如果我切换夜间模式选项,我更改的任何其他选项都不会立即保留 MainActivity 因为出于某种原因,即使在离开该活动时我的 onStop() 被调用,当我返回它时,onRestart() 没有被调用,我不知道为什么。

通常的生命周期说,如果活动停止,它应该在返回时调用 onRestart。 我不知道为什么切换我的夜间模式会改变它。 如果我转到另一个活动然后再回到那个活动,它会像往常一样触发 onRestart,它不仅在更改夜间模式后立即触发。

由于某种原因,这只发生在 API 27 及更低版本上。

有人知道这是什么原因吗?

解决方法

我通过将它放在主活动的 onPause() 中解决了这个问题:

override fun onPause() {
        super.onPause()
        while (rCreate == 0) {
            if (Build.VERSION.SDK_INT < 28) {
                recreate()
            }
            rCreate = 1
        }
    }

同时声明一个全局变量:

var rCreate: Int = 0

这可确保在夜间模式切换后重新创建活动,这又会触发 onStop(),而后者又会在返回视图后触发 onRestart(),而这仅发生在 API 27 或更低版本上。>

如果有人有更好的解决方案,请随意。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...