当 Android 使用嵌套片段和 getSupportFragmentManager() 在方向更改时重新创建我的应用程序时究竟发生了什么?

What exactly happens when Android recreates my app on an orientation change using nested fragments and getSupportFragmentManager()?

我查看了与此问题相关的其他线程,它们似乎都使用了 getChildFragmentManager(),但如果可能的话,我想使用 getSupportFragmentManager()。

这是问题所在: 我有包含子片段 B 的父片段 A。B 是一个选择器片段。当用户进行选择时,B 与 C 是 "replaced"。所以现在 A 持有 C。用户也可以返回 B 并打开一个显示其他数据的 C,我们将其称为 C'。当用户返回时,它是一个 "replace" 事务(不是返回堆栈)。此外,C 和 C' 是同一片段的不同实例 class.

这在大多数情况下工作正常,但我发现了一个导致异常行为的场景。

  1. 用户以纵向开始,B 显示

  2. 纵向用户,选择C

  3. 用户切换到横向

  4. 横向用户,C显示

  5. 用户切换回纵向

  6. 纵向用户,C显示

  7. 纵向用户,returns到B

  8. protrait中的用户,选择C'

  9. 用户切换到横向

  10. 横向用户,C'显示

  11. 用户切换回纵向

  12. 用户竖屏,B显示Huh?!

在#12,C' 应该仍然显示,而不是 B(选择器片段)。为什么 Android 不记得这里的 C'? 当 Android 使用嵌套片段和 getSupportFragmentManager() 在方向更改时重新创建我的应用程序时究竟发生了什么?

我认为这可能与使用容器 ID 和标签引用由 getSupportFragmentManager() 管理的片段之间的区别有关。如果我使用容器 ID,这会不会因为 xml 文件正在交换(即使容器 ID 名称没有改变)而在方向更改时搞砸了。希望这是有道理的。我正在使用容器 ID 顺便说一句。

一些其他背景信息:在这种特定情况下我根本没有使用返回堆栈。当我更改片段时,我正在使用 "replace" 事务和 "new" 保留字并创建一个新的嵌套片段。

此外,这里有一张图片可以帮助您更好地理解 A、B、C、C' 是什么:

这个问题与我调用 super.onCreate(savedInstanceState) 的事实有关,它在方向更改时维护旧片段并同时创建新片段。没有意识到 super.onCreate(savedInstanceState) 做到了。