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

时间:2013-10-01 09:30:16

标签: android android-fragments

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

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

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

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

3 个答案:

答案 0 :(得分:26)

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

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

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

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

你正在使用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);
}