纠正对Fragment Transaction BackStack的误解
2016-07-14 11:23
411 查看
目前在开发APP时,Fragment已经被开发者广泛使用,但Fragment的BackStack却被很多开发者误解。所以这篇博客就讨论下Fragment的BackStack及一些相关的常用接口。首先需要明确的是,FragmentActivity的FragmentManager是处理Fragment Transaction的而不是处理Fragment。BackStack内部的一个Transaction可以包含一个或多个和Fragment相关的操作。
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.add(restId, fragmentA);
ft.replace(fragmentB);
ft.commit(); 上面的一个FragmentTransaction既包含add操作又包含replace操作。
FragmentTransaction默认并不会主动被加入到BackStack中,除非开发者调用了addToBackStack(String tag)方法。参数'tag'将作为本次加入BackStack的Transaction的标志。
popBackStackImmediate()
下面举例说明Transaction BackStack的进栈和出栈。
如下图,使用FragmentActivity的FragmentManager创建Trasaction1并提交,使页面显示AFragment。这时调用popBackStack()就会移除AFragment并返回FragmentActivity。
在AFragment已经在栈顶的情况下,我们再创建Transation2并提交,Transaction 2添加了两个Fragment,提交后页面显示的是CFragment,这时调用popBackStack()就会将Transaction2从BackStack移除,即将CFragment和BFragment同时移除,页面将显示AFragment。
参考资料:
转自:http://blog.csdn.net/guxiao1201/article/details/40476267
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.add(restId, fragmentA);
ft.replace(fragmentB);
ft.commit(); 上面的一个FragmentTransaction既包含add操作又包含replace操作。
FragmentTransaction默认并不会主动被加入到BackStack中,除非开发者调用了addToBackStack(String tag)方法。参数'tag'将作为本次加入BackStack的Transaction的标志。
FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.add(resId, fragmentA); ft.replace(resId, fragmentB); ft.addToBackstack("tag"); ft.commit();和addToBackStack相对应的接口方法是popBackStack(),调用该方法后会将事物操作插入到FragmentManager的操作队列,只有当轮询到该事物时才能执行。所以Google还提供了可以立刻执行的接口
popBackStackImmediate()
下面举例说明Transaction BackStack的进栈和出栈。
如下图,使用FragmentActivity的FragmentManager创建Trasaction1并提交,使页面显示AFragment。这时调用popBackStack()就会移除AFragment并返回FragmentActivity。
@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(); }
在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(); }
参考资料:
Transaction BackStack and its management
转自:http://blog.csdn.net/guxiao1201/article/details/40476267
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories