gpt4 book ai didi

android - AppCompatDelegate.setDefaultNightMode() 仅在第一次被主要 Activity 获取?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:09:24 24 4
gpt4 key购买 nike

运行 Android P,使用 androidx 1.0.0(minSdkVersion 17)。从我的 MainActivity 打开我的 PreferenceActivity。我在那里更改了 UI 主题,并重新创建 Activity 以获取更改:

AppCompatDelegate.setDefaultNightMode(nightMode);
recreate();

更新主题后,我返回到 MainActivity。主题已成功更新。然后我重新打开 PreferenceActivity 并再次更改主题

到目前为止一切顺利!

最后,我再次返回到 MainActivity。主题更新,如果您重复这些步骤,它也不会更新!

因此,重现的步骤似乎是:

  1. 从 Activity A,打开 Activity B。
  2. 在 B 中,调用 AppCompatDelegate.setDefaultNightMode(MODE_NIGHT_YES),然后调用 recreate()。主题已更新!
  3. 返回A,主题已更新!
  4. 再次打开 Activity B。
  5. 在 B 中,调用 AppCompatDelegate.setDefaultNightMode(MODE_NIGHT_NO),然后调用 recreate()。主题已更新!
  6. 返回 A。主题更新,如果重复步骤 3-6 将更新!

我尝试在从 PreferenceActivity 返回时调用 recreate(),但是当库确实对主题更改使用react时,这会产生另一个问题:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (...) {
recreate();
} else {
super.onActivityResult(requestCode, resultCode, data);
}
}

当图书馆不对更新的主题使用react时,这会起作用。否则 Activity 会被重新创建两次(调试时可能更多),这会降低性能等:

D/MainActivity: onActivityResult(): instance 1
D/MainActivity: onResume(): instance 1
D/MainActivity: onPause(): instance 1
D/MainActivity: onDestroy(): instance 1

D/MainActivity: onCreate(): instance 2
D/MainActivity: onResume(): instance 2
D/MainActivity: onPause(): instance 2
D/MainActivity: onDestroy(): instance 2

D/MainActivity: onCreate(): instance 3
D/MainActivity: onResume(): instance 3

问: setDefaultNightMode() API 发生了什么?更重要的是,我如何才能成功更新所有正在运行的 Activity ,而不必冒多次重新创建它们的风险?

更新

此处有一个演示该问题的示例项目:https://issuetracker.google.com/issues/119757688

最佳答案

当您更改夜间模式时,将模式值存储到共享首选项中。

AppCompatDelegate.setDefaultNightMode(nightMode);
recreate(); //only recreate setting activity
...//store mode value, these lines are omitted,please complete yourself

在其他 Activity 的 onCreate() 方法中:

...//get mode from share preference, these lines are omitted.
AppCompatDelegate.setDefaultNightMode(mode)//must place before super.onCreate();
super.onCreate(savedInstanceState);

关于android - AppCompatDelegate.setDefaultNightMode() 仅在第一次被主要 Activity 获取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53356664/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com