20

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

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

我最初的问题是我得到了一些与其他问题相似的片段的副本。我通过以下方式解决了这个问题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吗?因为由于具有不同数量的片段的不同方向布局,我的初衷是仅重新创建一个标记为保留的状态片段,而不恢复未标记为保留的其他视图片段。
4

1 回答 1

8

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

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

于 2013-05-18T20:54:19.933 回答