在重新创建父片段之后获取对子片段的引用

从Android 4.2开始,Android支持嵌套片段 。 doc没有给出关于嵌套Fragment生命周期的大量解释,但从经验来看,它们的生命周期看起来与“常规” Fragments非常相似。

看起来有一个很大的区别:当调用父Fragment onCreate方法时,不会恢复子Fragments 。 因此,似乎无法保存/恢复对特定Fragment的引用:

  • 使用getChildFragmentManager.findFragmentByTag(String)始终在父Fragment onCreate(Bundle)返回null ,因为mActivenull
  • 使用putFragment / getFragment导致NullPointerException因为getFragment查找null mActive ArrayList的大小。

所以,我的问题很简单。 是否有正确的方法来检索父Fragment onCreate方法中对子Fragment的引用?

Solutions Collecting From Web of "在重新创建父片段之后获取对子片段的引用"

我不认为你可以在onCreate因为当时没有构建视图。 你可以在onViewCreated() 。 我使用的逻辑是:

  • 检查onViewCreated()中是否有保存状态,如果有,请尝试获取子片段
  • 然后检查子片段是否为null,如果是,则使用子片段管理器添加它。

通过“检查”我的意思是通过id查找片段。 我想通过标签也应该工作。

AFAIK 恢复或创建视图层次结构之前无法获取子片段,但您可以在以后执行相同的操作,例如在onActivityCreated()

你的片段上的setRetainInstanceState(true)怎么样? 它可以解决你的问题吗? 当我在片段中有ChildFragments时,它解决了一些问题。 我只需要在片段中保留对childfragment的引用。

但我总是在onCreateView()中做到这一点。 不确定它是否适用于onCreate()

或者你的意思是完全不同的东西?

你使用FragmentPagerAdapter吗? 如果没有尝试FragmentPagerAdapter而不是FragmentStatePagerAdapter,我意识到当我有4级嵌套时使用FragmentStatePagerAdapter会有一些bug。 抱歉,我的英语很差。

 @Override public void onCreate(Bundle savedInstanceState) { if (savedInstanceState != null) { mFragment1 = getFragmentManager().getFragment(savedInstanceState, STATE_Fragment1); mFragment2 = getFragmentManager().getFragment(savedInstanceState, STATE_Fragment2); mFragment3 = getFragmentManager().getFragment(savedInstanceState, STATE_Fragment3); } else { mFragment1 = SomeFragment.newInstance("param1"); mFragment2 = SomeFragment.newInstance("param2"); mFragment3 = SomeFragment.newInstance("param3"); } super.onCreate(savedInstanceState); mMyPagerAdapter = new MyPagerAdapter(getChildFragmentManager(), mFragment1, mFragment2, mFragment3); } @Override public void onSaveInstanceState(Bundle outState) { if (mFragment1 != null) { getFragmentManager().putFragment(outState, STATE_Fragment1, mFragment1); } if (mFragment2 != null) { getFragmentManager().putFragment(outState, STATE_Fragment2, mFragment2); } if (mFragment3 != null) { getFragmentManager().putFragment(outState, STATE_Fragment3, mFragment3); } super.onSaveInstanceState(outState); }