21

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

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

  • 使用getChildFragmentManager.findFragmentByTag(String)总是返回null父级Fragment onCreate(Bundle),因为mActiveis null
  • 使用putFragment/getFragment导致 aNullPointerException因为getFragment查找 null 的大小mActive ArrayList

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

4

3 回答 3

26

我认为您不能进入,onCreate因为当时还没有构建视图。不过你可以进去onViewCreated()。我使用的逻辑是:

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

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

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

于 2013-10-01T09:50:59.417 回答
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);
}
于 2014-01-28T19:52:51.363 回答
1

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

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

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

于 2013-10-01T21:27:19.973 回答