纠正对Fragment Transaction BackStack的误解
来源:互联网 发布:男人月薪4500 知乎 编辑:程序博客网 时间:2024/04/26 22:25
转载请注明出处:http://write.blog.csdn.net/postedit/40476267
目前在开发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默认并不会主动被加入到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
- 纠正对Fragment Transaction BackStack的误解
- 纠正对Fragment Transaction BackStack的误解
- 纠正对Fragment Transaction BackStack的误解
- 纠正对Fragment Transaction BackStack的误解
- 纠正对Fragment Transaction BackStack的误解
- 纠正对Fragment Transaction BackStack的误解
- 纠正对Fragment Transaction BackStack的误解
- 正对Fragment Transaction BackStack的误解
- 纠正对viewstate的误解
- 纠正css中对width的误解
- 原创:纠正国人对Linux的误解和错误认识
- 纠正国人对Linux的误解和错误认识
- 纠正国人对Linux的误解和错误认识
- 纠正部分Linux初学者对ctime的误解
- 关于之前对#pragma pack ()误解的纠正
- 纠正对C语言指针的误解(一)
- Fragment的BackStack管理过程
- Android的Fragment BackStack回退功能
- SparkSQL之数据源
- AFN文档中文翻译以及简单使用说明
- C#学习之多线程开发技术(九)
- 第6周—项目5 后缀表达式
- Java高级_网络编程
- 纠正对Fragment Transaction BackStack的误解
- 又开了一个C语言最强最全班
- 第六周--项目四--数制转换
- C# 提示框MessageBox
- swift开发笔记10 - 通过drawRect自定义控件外观
- 20151007
- 数据库概述
- 栈和堆的区别
- CImg 图像库 存储结构