对于拥有ID的View
个人,在致电super.onSaveInstanceState(outState);
时会自动保存这些ID。
对于添加到Fragment
的{{1}},在重新创建Activity
(例如屏幕旋转)时将重新创建的情况是什么,以及什么是这个案子不会吗?怎么决定?规则是什么?
到目前为止,我已尝试过以下案例。但是试验错误并不意味着任何规则或解决方案。
重新存储Activity
的情况:
Fragment
到带有ID的布局。FragmentTransaction.add()
仅限标记 FragmentTransaction.add()
s NOT 重新存储的情况:
Fragment
时。super.onSaveInstanceState(outState);
。一般规则是什么?我在文档中遗漏了什么?
提前致谢。
根据我的理解和实验,所有动态(以编程方式)添加的Fragment
都会保存在Fragment
来电Activity
上。
super.onSaveInstanceState(outState)
s 包含,
Fragment
只有一个标签(没有用户界面),Fragment
附加到Fragment
(带有用户界面),View
,两者一个用户界面和一个标记。关于将具有UI的Fragment
恢复为没有匹配ID的布局,确实重新创建了Fragment
。它无法在布局中以可视方式显示,并显示以下警告消息:
Fragment
一旦我们回到具有匹配ID的UI,它将被正确恢复。
答案 0 :(得分:1)
我遇到了同样的问题,你可以在这里看到: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开发者文档引用了这个:
当配置更改导致托管这些活动时 要重新启动的片段,其新实例可能会使用不同的布局 不包含与先前布局相同的片段。在这 case仍然会实例化所有以前的片段 在新实例中运行。但是,任何不再是 与视图层次结构中的标记关联不会 他们创建了内容视图,并将从isInLayout()返回false。 (此处的代码还显示了如何确定是否放置了片段 在容器中不再在具有该容器的布局中运行 并避免在这种情况下创建其视图层次结构。)
这意味着,我们必须检查屏幕方向而不是相信空指针检查。