0

对于View有ID的s,调用时会自动保存super.onSaveInstanceState(outState);

对于Fragments 添加到 an Activity,在什么情况下会在重新创建时Activity重新创建(例如屏幕旋转),在哪些情况下不会?要确定什么?规则是什么?

到目前为止,我已经尝试了以下案例。但是反复试验并不意味着任何规则或解决方案。

Fragment重新存储s的情况:

  1. 正常情况:FragmentTransaction.add()带有 ID 的布局。
  2. 没有 UI 的片段:FragmentTransaction.add()仅到标签

重新存储Fragments 的情况:

  1. 何时super.onSaveInstanceState(outState);跳过。
  2. 在没有匹配 ID 的 UI 中恢复Fragments。

一般规则是什么?我在文档中遗漏了什么?

提前致谢。


编辑:

根据我的理解和实验,所有动态(以编程方式)添加Fragment的 s 都在Activity调用时保存super.onSaveInstanceState(outState)

  • 所有动态(以编程方式)添加Fragment的 s包括,
    • Fragments 只有一个标签(没有 UI),
    • Fragments 附加到一个View(带有 UI),
    • Fragments同时带有 UI 和标签。
    • (还有其他类型吗?)

关于将Fragment带有 UI 的 a 恢复到没有匹配 ID 的布局中,Fragment确实是重新创建的。它只是无法在布局中直观地显示,并带有以下警告消息:

04-08 11:41:22.445: W/PhoneWindow(9853): Previously focused view reported id 2131165226 during save, but can't be found during restore.

一旦我们返回到具有匹配 ID 的 UI,它将正确恢复。


仍然期待一些可靠的参考资料和您的意见!

4

1 回答 1

1

我有同样的问题,你可以在这里看到:屏幕旋转后,findFragmentById() 返回一个片段,即使布局内没有这样的 ID

http://developer.android.com/training/basics/fragments/communicating.html上的 Android 开发者文档引用了这一点:

当配置更改导致托管这些片段的活动重新启动时,其新实例可能会使用不同的布局,该布局不包含与先前布局相同的片段。在这种情况下,所有先前的片段仍将被实例化并在新实例中运行。但是,任何不再与视图层次结构中的标记关联的内容都不会创建其内容视图,并且将从 isInLayout() 返回 false。(此处的代码还显示了如何确定放置在容器中的片段是否不再在具有该容器的布局中运行,并避免在这种情况下创建其视图层次结构。)

这意味着,我们必须检查屏幕方向而不是相信空指针检查。

于 2013-11-22T19:47:26.420 回答