【问题标题】:How automatic fragment restore works自动片段恢复的工作原理
【发布时间】:2013-03-23 22:05:52
【问题描述】:

当使用FragmentActivity 时,它会自动恢复片段状态并重新创建所有片段。

我知道这主要是在onSaveInstanceState 中保存状态,然后在活动的onCreate 中恢复。稍微看一下代码,我发现所有片段都被重新创建(或仅在 retainInstance 为真时附加)并添加到 FragmentManager 但我不清楚它们以哪种方式添加到视图中,因为视图是'不会自动恢复。

我最初的问题是我得到了一些类似于that other question 的片段的副本。 我在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
   }

现在它可以工作了,但我仍然不完全了解它是如何工作的。

我的疑惑是:

  • 片段是在什么时候以及如何附加到视图的?我已经尝试在onCreateFragmentActivity 中完成片段恢复。但是如果我在那之后调用setContentView,片段如何附加到视图?
  • 我能否在不覆盖onSaveInstanceState 的情况下阻止片段重新生成?因为由于具有不同数量的片段的不同方向布局,我的初衷是仅重新创建一个标记为保留的状态片段,而不恢复未标记为保留的其他视图片段。

【问题讨论】:

    标签: android android-fragments android-orientation


    【解决方案1】:

    视图层次结构不会自动恢复。因此,在Fragment.onCreateView()Activity.onCreate() 中,您必须恢复所有视图(从 xml 或以编程方式)。每个包含片段的ViewGroup 必须具有与您第一次创建它时相同的 ID。一旦创建了视图层次结构,Android 就会恢复所有片段并将它们的视图放在正确的ViewGroup 中,这要归功于 ID。假设 Android 记住了片段所在的 ViewGroup 的 ID。 这发生在onCreateView()onStart() 之间。

    我认为可以保留片段重新创建,但是在保存片段的 ViewGroup 上,将可见性设置为 GONE。这样,片段就不会出现,您可以稍后通过编程方式将其删除。

    【讨论】:

      猜你喜欢
      • 2021-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-10
      • 1970-01-01
      • 1970-01-01
      • 2021-05-31
      • 1970-01-01
      相关资源
      最近更新 更多