获得对父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的引用?

  • AsyncTask,Fragments,Views和Backstacks
  • DataPicker在新的API上也看起来像旧的devise
  • 挂钩到像Application.ActivityLifecycleCallbacks片段的生命周期
  • Android:片段无法获得活动
  • Android中嵌套片段之间的通信
  • 必须在添加内容之前调用ActionBarActivity requestFeature
  • 为什么片段类可能不是有效的?
  • 片段中EditText和软键盘的问题
  • 我不认为你可以在这个时候创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); }