使用 (Child)FragmentManager 正确使用子子片段
Posted
技术标签:
【中文标题】使用 (Child)FragmentManager 正确使用子子片段【英文标题】:Proper use of sub sub fragments with (Child)FragmentManager 【发布时间】:2014-01-07 17:25:27 【问题描述】:如何在 Fragments 中正确使用 Fragments?
我的(简化的)用例如下,我有一个带有布局片段的活动,这个片段本身包含一个子片段......所有片段都手动添加到它们的父片段......
----------------------------------------------------------
- Activity -
- -
- -
- --------------------------------------- -
- - Fragment - -
- - - -
- - ----------------- - -
- - - SubFragment - - -
- - - - - -
- - - - - -
- - ----------------- - -
- --------------------------------------- -
- -
----------------------------------------------------------
现在在我的活动onCreate
中,我执行以下操作:
if (savedInstanceState == null)
// I create the fragment
mMainFragment = new MainFragment();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.fragment_main, mMainFragment);
transaction.commit();
else
// I retrieve the fragment
mMainFragment = (BaseFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_main);
在我的片段onCreate
我得到/创建我的子片段:
mSubFragment = getChildFragmentManager().findFragmentByTag(SubFragment.class.getName());
if (mSubFragment == null)
mSubFragment = new SubFragment();
getChildFragmentManager().beginTransaction().add(R.id.fragment_sub, mSubFragment, SubFragment.class.getName()).commit();
问题
屏幕旋转后,我的 SubFragment 添加了两次...如果我使用活动的FragmentManager
那么它可以工作...但是为什么它不适用于ChildFragmentManager
?当然,Fragment 是一个新的 Fragment,但 Activity 也是一个新的,为什么它与 Activity 的FragmentManager
一起工作,而与父 Fragment 的不工作?
在片段中,我应该使用片段ChildFragmentManager
,不是吗?
【问题讨论】:
不是同一个问题,但是来这里的其他人,请看相关Communication between nested fragments in android。 【参考方案1】:您应该将SubFragment
添加到Fragment
,就像将Fragment
添加到Activity
一样。我的意思是将Fragment
添加到Activity
应该是这样的:
@Override
public void onCreate(Bundle savedInstanceState)
....
if (savedInstanceState == null)
//add fragment
mMainFragment = new MainFragment();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.fragment_main, mMainFragment);
transaction.commit();
将SubFragment
添加到MainFragment
应如下所示:
public class MainFragment extends Fragment
@Override
public View onCreateView(LayoutInflater i, ViewGroup c, Bundle savedInstanceState)
...
if (savedInstanceState == null)
mSubFragment = new SubFragment();
//add child fragment
getChildFragmentManager()
.beginTransaction()
.add(R.id.fragment_sub, mSubFragment, "tag")
.commit();
或者您可以在onCreate
方法中将子片段添加到Fragment
【讨论】:
我认为这就是 OP 发布的问题。 @lionelmessi 不,他使用 onCreateVIEW 与 onCreate。我认为这是正确的答案 如果片段 A 持有 B,B 持有 C,那么是否也应该使用子片段管理器添加片段 C?以上是关于使用 (Child)FragmentManager 正确使用子子片段的主要内容,如果未能解决你的问题,请参考以下文章
在 DialogFragment 中使用 FragmentManager 和 FragmentTransaction
Android中FragmentManager进行片段回收的目的是啥?
从 Fragment (support.v4) 中获取 FragmentManager [重复]