获得对父Fragment之后的子Fragment的引用已被重新创build

从Android 4.2开始,Android支持嵌套的Fragments 。 文档没有给出关于嵌套Fragment生命周期的很多解释,但从经验来看,它们的生命周期似乎与“常规” Fragments非常相似。

它看起来像有一个很大的区别,虽然:子Fragments不会恢复父级Fragment onCreate方法被调用时。 因此,保存/恢复对特定Fragment的引用似乎是不可能的:

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

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

Solutions Collecting From Web of "获得对父Fragment之后的子Fragment的引用已被重新创build"

我不认为你可以在这个时候创build​​视图。 你可以在onViewCreated()虽然。 我使用的逻辑是:

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

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

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

那么你的片段setRetainInstanceState(true)呢? 它能解决你的问题吗? 当我在一个片段中有ChildFragments时,它解决了一些问题。 我只需要在片段中保留对子片段的引用。

但我总是在onCreateView()中做到这一点。 不知道它是否会在onCreate()

或者你的意思完全不同?

你使用FragmentPagerAdapter? 如果不尝试FragmentPagerAdapter而不是FragmentStatePagerAdapter我意识到有一些使用FragmentStatePagerAdapter时,我有4级嵌套的错误。 对不起,我的英文很差。

 @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); }