当使用 FragmentActivity
时,它会自动恢复 fragment 状态并重新创建所有 fragment 。
我知道这主要是在 onSaveInstanceState
中保存状态,然后在 Activity 的 onCreate
中恢复。稍微看一下代码,我发现所有 fragment 都被重新创建(或仅在 retainInstance 为真时附加)并添加到 FragmentManager
但我不清楚它们以哪种方式添加到 View ,因为 View 不会自动恢复。
我最初的问题是我得到了一些类似于 that other question 的 fragment 的副本。 .
我在 onCreate
中解决了这个问题:
Fragment f = fm.findFragmentByTag(tagName);
if(f==null) {
f = createFragment();
fm.beginTransaction().add(R.id.myContainer,f,tagName).commit();
} else {
//Nothing it's on the view
}
现在它可以工作了,但我仍然不完全了解它是如何工作的。
我的疑惑是:
- fragment 是在什么时刻以及如何附加到 View 上的?我已经尝试在
FragmentActivity
的onCreate
中完成 fragment 恢复。但是如果我在那之后调用setContentView
, fragment 如何附加到 View ? - 我可以在不覆盖
onSaveInstanceState
的情况下阻止 fragment 重新创建吗?因为由于具有不同数量的 fragment 的不同方向布局,我的初衷是仅重新创建一个标记为保留的状态 fragment ,而不恢复未标记为保留的其他 View fragment 。
最佳答案
View 层次结构不会自动恢复。因此,在 Fragment.onCreateView()
或 Activity.onCreate()
中,您必须恢复所有 View (从 xml 或以编程方式)。每个包含 fragment 的 ViewGroup
必须具有与您第一次创建它时相同的 ID。一旦创建了 View 层次结构,Android 就会恢复所有 fragment 并将它们的 View 放在正确的 ViewGroup
中,这要归功于 ID。假设 Android 记住 fragment 所在的 ViewGroup
的 ID。
这发生在 onCreateView()
和 onStart()
之间。
我认为可以保持 fragment 重新创建,但是在保存 fragment 的 ViewGroup 上,将可见性设置为 GONE。这样, fragment 就不会出现,您可以稍后通过编程方式将其删除。
关于android - 自动 fragment 恢复的工作原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15592628/