<span style="font-size:24px;">FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.add(restId, fragmentA);
ft.replace(fragmentB);
ft.commit();</span>
上面的一个FragmentTransaction既包含add操作又包含replace操作。
FragmentTransaction默认并不会主动被加入到BackStack中,除非开发者调用了addToBackStack(String tag)方法。参数'tag'将作为本次加入BackStack的Transaction的标志。
<span style="font-size:24px;">FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.add(resId, fragmentA);
ft.replace(resId, fragmentB);
ft.addToBackstack("tag");
ft.commit();</span>
和addToBackStack相对应的接口方法是popBackStack(),调用该方法后会将事物操作插入到FragmentManager的操作队列,只有当轮询到该事物时才能执行。所以Google还提供了可以立刻执行的接口
<span style="font-size:24px;">popBackStackImmediate()</span>
下面举例说明Transaction BackStack的进栈和出栈。
如下图,使用FragmentActivity的FragmentManager创建Trasaction1并提交,使页面显示AFragment。这时调用popBackStack()就会移除AFragment并返回FragmentActivity。
<span style="font-size:24px;">@Override
public void addFragment(BaseFragment baseFragment) {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.home_frame_layout_for_fragments, baseFragment, baseFragment.getTagText());
ft.addToBackStack(baseFragment.getTagText());
ft.commit();
}</span>
在AFragment已经在栈顶的情况下,我们再创建Transation2并提交,Transaction 2添加了两个Fragment,提交后页面显示的是CFragment,这时调用popBackStack()就会将Transaction2从BackStack移除,即将CFragment和BFragment同时移除,页面将显示AFragment。
@Override
public void addMultipleFragments(BaseFragment[] baseFragments) {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
for(int i = 0 ; i < baseFragments.length ; i++) {
ft.replace(R.id.home_frame_layout_for_fragments, baseFragments[i], baseFragments[i].getTagText());
}
ft.addToBackStack(baseFragments[0].getTagText());
ft.commit();
}
参考资料: