启动Android 4.2,Android支持nested Fragments。 doc没有给出关于嵌套Fragment
生命周期的大量解释,但从经验来看,它们的生命周期看起来与“常规”Fragments
非常相似。
看起来有一个很大的区别:当调用父Fragments
Fragment
方法时,不会恢复子onCreate
。因此,似乎无法保存/恢复对特定Fragment
的引用:
getChildFragmentManager.findFragmentByTag(String)
始终会在父null
Fragment
中返回onCreate(Bundle)
,因为mActive
为null
。putFragment
/ getFragment
会产生NullPointerException
,因为getFragment
会查找空mActive
ArrayList
的大小。所以,我的问题很简单。是否有正确的方法来检索父Fragment
Fragment
方法中对子onCreate
的引用?
答案 0 :(得分:26)
我认为你不能在onCreate
因为当时没有构建视图。你可以在onViewCreated()
。我使用的逻辑是:
onViewCreated()
中是否存在保存状态,如果有,请尝试获取子片段通过“检查”我的意思是通过id查找片段。我想通过标签也应该有用。
AFAIK您无法在恢复或创建视图层次结构之前获取子片段,但您可以在以后执行相同的操作,例如在onActivityCreated()
答案 1 :(得分:1)
片段上的setRetainInstanceState(true)怎么样? 它可以解决你的问题吗?当我在片段中有ChildFragments时,它解决了一些问题。我只需要在片段中保留对childfragment的引用。
但我总是在onCreateView()中做到这一点。不确定它是否适用于onCreate()
或者你的意思是完全不同的东西?
答案 2 :(得分:1)
@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);
}