android - 自动 fragment 恢复的工作原理

标签 android android-fragments android-orientation

当使用 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 上的?我已经尝试在 FragmentActivityonCreate 中完成 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/

相关文章:

android - 通知网络变化的 Activity - Android

Android Spinner 值和文本

android - 如何使动画在触摸时开始并在再次触摸时停止?

android - 适配chrisbanes Action Bar-Pull To Refresh to Fragments(Navigation Drawer)

android - fragment 中的 EditText 和软键盘问题

android - 仅在我的 viewpager 的第一页中显示进度条

android - 方向改变事件或监听器 Android

java - Android 应用程序在 Calender.getInstance 处没有响应

android - RecyclerView 在旋转时为空

Android WebView - 在方向后调整大小而不重新加载页面