在父Fragment重新创建后获取子Fragment的引用

21

Android 4.2及以上版本开始支持嵌套片段(nested Fragments)。文档没有对嵌套Fragment的生命周期进行详细说明,但是经验表明,它们的生命周期与“常规”Fragments非常相似。

然而,看起来有一个重大区别:当调用父FragmentonCreate方法时,子Fragments并不会被还原。因此,似乎不可能保存/恢复对特定Fragment的引用:

  • 在父FragmentonCreate(Bundle)方法中使用getChildFragmentManager.findFragmentByTag(String)总是返回null,因为mActivenull
  • 使用putFragment/getFragment会导致NullPointerException,因为getFragment查找了空mActiveArrayList的大小。

那么,我的问题很简单。是否有一种正确的方法在父FragmentonCreate方法中检索对子Fragment的引用?


getChildFragmentManager().getFragments()是否有对子片段的引用? - rarp
1
我只使用过支持库实现的嵌套片段,但我可以说的是,在那里嵌套片段会被重新创建,对于动态情况,您需要遵循通常的“检查标记的片段是否在子片段管理器中,否则重新创建片段”的循环。例如,当我将子片段用作“工作者”时,这对我非常有效。 - Thomas Keller
3个回答

26

我认为你不能在onCreate方法中执行此操作,因为此时视图并没有被构建。但你可以在onViewCreated()方法中执行。我使用的逻辑如下:

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

通过“检查”,我指的是通过id查找片段。我猜通过标签也应该可以。

据我所知,在视图层次结构被恢复或创建之前,您无法获得子片段,但您可以在稍后的时间内执行相同的操作,例如在onActivityCreated()方法中。


我同意这个答案。对于一个无界面的碎片,我使用onActivityCreated钩子来访问子碎片。 - jayeffkay

1
你的片段上设置setRetainInstanceState(true)如何?它能解决你的问题吗?当我在一个片段中有子片段时,它解决了一些问题。我只需要在片段中保留对子片段的引用。 但我总是在onCreateView()中执行此操作。不确定它是否适用于onCreate()。 或者你指的是完全不同的事情?

1

你是否正在使用FragmentPagerAdapter?如果没有,请尝试使用FragmentPagerAdapter而不是FragmentStatePagerAdapter。我发现在4级嵌套时使用FragmentStatePagerAdapter会出现一些错误。抱歉我的英语很差。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接