如何确定活动重新创建时的片段恢复?

问题描述:

对于有ID的View,调用super.onSaveInstanceState(outState);时会自动保存。如何确定活动重新创建时的片段恢复?

对于Fragment将其添加到Activity,它将在重新创建Activity(例如屏幕旋转)时重新创建的情况是什么,以及它不会有什么情况?要确定什么?什么是规则?

到目前为止,我已经尝试过以下情况。但是,试错误并不意味着任何规则或解决方案。

例时Fragment s的重新存储:

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

例时Fragment s为NOT重新存储:

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

什么是一般规则?我在文档中错过了什么?

在此先感谢。


编辑:

据我了解,和实验,所有动态(编程)添加Fragment s的在他们Activity调用super.onSaveInstanceState(outState)保存。

  • 所有动态(编程)加入Fragment小号包括
    • Fragment s的仅一个标签(无UI),附
    • Fragment s到一个View(与UI),
    • Fragment s与均为一个UI和一个标签。
    • (是否有任何其他类型?)

关于恢复与UI一个Fragment到与没有匹配的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的用户界面中,它将被正确地恢复。


我是仍然期待一些可靠的参考和你的意见!

+0

随着[源代码](https://android.googlesource.com/platform/frameworks/support/+/master/v4/java/android/support/v4/app),所有的问题都可以解决: ) – midnite 2013-06-06 02:01:37

我有同样的问题,你可以在这里看到:After screen rotation, findFragmentById() returns a fragment, even if there's no such ID inside the layout

http://developer.android.com/training/basics/fragments/communicating.html引号这个Android的开发者文档:

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

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