如何确定活动重新创建时的片段恢复?
对于有ID的View
,调用super.onSaveInstanceState(outState);
时会自动保存。如何确定活动重新创建时的片段恢复?
对于Fragment
将其添加到Activity
,它将在重新创建Activity
(例如屏幕旋转)时重新创建的情况是什么,以及它不会有什么情况?要确定什么?什么是规则?
到目前为止,我已经尝试过以下情况。但是,试错误并不意味着任何规则或解决方案。
例时Fragment
s的重新存储:
- 正常情况下:
FragmentTransaction.add()
到带有ID的布局。 - 片段没有UI:
FragmentTransaction.add()
标签的只
例时Fragment
s为NOT重新存储:
- 当
super.onSaveInstanceState(outState);
被跳过。 - 在没有匹配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的用户界面中,它将被正确地恢复。
我是仍然期待一些可靠的参考和你的意见!
我有同样的问题,你可以在这里看到: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。 (这里的代码也显示了如何确定一个片段在容器中放入 在与容器 布局不再运行,并避免在这种情况下创建其视图层次)。
这意味着,我们必须检查屏幕方向而不是相信空指针检查。
随着[源代码](https://android.googlesource.com/platform/frameworks/support/+/master/v4/java/android/support/v4/app),所有的问题都可以解决: ) – midnite 2013-06-06 02:01:37