2013-03-23 36 views
19

当使用FragmentActivity时,它会自动恢复碎片状态并重新创建所有碎片。自动碎片恢复如何工作

我知道这样做主要是将状态保存在onSaveInstanceState中,然后在活动的onCreate中恢复。仔细看看代码,我发现所有片段都被重新创建(或者只有在retainInstance为true的情况下才会被附加)并添加到FragmentManager中,但是我不清楚它们以何种方式添加到视图中,因为视图不是自动恢复。

我原来的问题是我得到一些类似于that other question的片段的重复。 我workarrounded在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 
    } 

现在它的工作原理,但我仍然不能完全理解它是如何工作的。

我的疑惑是:

  • 在这一刻,以及如何被碎片附着在查看?我已经试验过片段的恢复是在FragmentActivityonCreate中完成的。但是如果我在那之后打电话setContentView,片段如何附加到视图上?
  • 我可以防止片段娱乐而不覆盖onSaveInstanceState?由于不同的方向布局和不同数量的片段,我的初衷是重新创建一个标记为保留的状态片段,而不会恢复未标记为保留的其他片段片段。

回答

7

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

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