Activity切换时是通过栈的形式,不断压栈出栈,在Fragment的时候,如果你不是手动开启回退栈,它是直接销毁再重建,但如果将Fragment任务添加到回退栈,情况就会不一样了,它就有了类似Activity的栈管理方式。

使用Fragment时,可以通过用户交互来执行一些动作,比如增加、移除、替换等。所有这些改变构成一个集合,这个集合被叫做一个transaction。

可以调用FragmentTransaction中的方法来处理这个transaction,并且可以将transaction存进由activity管理的back stack中,当用户按返回键时,就会自动回到上一个fragment的状态。和Activity一样的使用体验

public void startToFragment(Context context, int container, Fragment newFragment) {
FragmentManager manager = context.getFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(container, newFragment);
transaction.addToBackStack(context.getClass().getName());
     transaction.commit();
}
Fragment2 fragment2 = new Fragment2 ();
startToFragment(getActivity(), R.id.layout_container, fragment2 );

1,在FragmentManager.transaction.addToBackStack();向一个栈中一个一个的添加Fragment,从而实现在你添加后,可以在按返回键时一个一个的返回Fragment

2,FragmentManager的popBackStack()方法,就是一个一个的返回Fragment

3,FragmentManager的popBackStack(name,flag)方法,就是

//其中name是加入栈中的Fragment名字

//flag表示移走栈中Fragment的方式(0:把自己之前的弹出)(1:包括自己都弹出)

4,FragmentManager的popBackStack(id,flag)方法

//其中id,在FragmentManager事物提交时,会返回一个int值,每次提交会自动加1

//flag表示移走栈中Fragment的方式(0:把自己之前的弹出)(1:包括自己都弹出)

(补充:FragmentManager.commit()会返回一个int值,标记这次的提交!!)

https://www.jianshu.com/p/b8aca9976608

commit()和commitAllowingStateLoss()的区别

Fragment的控制采用事务方式执行,在事务执行之前,用户可能已经点击了返回键,导致Activity的onSaveInstanceState()方法被调用,在保存当前activity实例的状态以备恢复。

在onSaveInstanceState()方法中会将一个成员变量mStateSaved设为true。采用commit()方式提交事务,在执行时会检查mStateSaved的值,若为true,则会抛出异常。因此事务必须保证在用户点击返回键之前执行。

而采用commitAllowingStateLoss()方式提交事务,在执行时不会检查mStateSaved的值,不会发生异常。

Fragment回退栈&commit()和commitAllowingStateLoss()的更多相关文章

  1. Fragment 回退栈 传递参数,点击切换图片使用Fragment ListView

    Fragment回退栈  类似与Android系统为Activity维护一个任务栈,我们也可以通过Activity维护一个回退栈来保存每次Fragment事务发生的变化. 如果你将Fragment任务 ...

  2. 清空Fragment回退栈中某个Fragment之上的所有Fragment

    根据debug信息查看Fragment回退栈的情况,具体debug代码如下: int num = getActivity().getSupportFragmentManager().getBackSt ...

  3. 清空Fragment回退栈中某个Fragment

    出栈的方法:getActivity().getSupportFragmentManager().popBackStackImmediate(CreateOneFragment.class.getNam ...

  4. Android零基础入门第89节:Fragment回退栈及弹出方法

    在上一期分享的文章末尾留了一个课后作业,有去思考如何解决吗?如果已经会了那么恭喜你,如果还不会也没关系,本期一起来学习. 一.回退栈 在前面两期的示例中,当我们完成一些操作后,如果想要回到操作之前的状 ...

  5. Android清空Fragment回退栈

    啊= =:国内的资料为什么都是抄来抄去的. 最后上了Stack Overflow才找到了正解. FragmentManager fragmentManager = getFragmentManager ...

  6. FragmentTransaction的commit和commitAllowingStateLoss的差别

    1.什么是FragmentTransaction? 使用Fragment时.能够通过用户交互来运行一些动作.比方添加.移除.替换等. 全部这些改变构成一个集合,这个集合被叫做一个transaction ...

  7. 从源码看commit和commitAllowingStateLoss方法区别

    Fragment介绍 在很久以前,也就是我刚开始写Android时(大约在2012年的冬天--),那时候如果要实现像下面微信一样的Tab切换页面,需要继承TabActivity,然后使用TabHost ...

  8. 深入理解Activity-任务,回退栈,启动模式

    一.任务.回退栈的概念 一个任务是多个能够和用户进行交互并且能完成某种功能的activities的集合. 这些Activity被安排回退栈中,能在合适的时候被打开显示出来. 在我们使用Android手 ...

  9. Android开发-API指南-任务和回退栈

    Task and Back Stack 英文原文: http://developer.android.com/guide/components/tasks-and-back-stack.html 采集 ...

随机推荐

  1. Luogu P2575 高手过招

    题目链接 \(Click\) \(Here\) 关键在于转换成阶梯\(Nim\)的模型.最开始把题目看错了,理解正确后发现棋子可以向后跳不止一位,那么就比较简单了. 这里把空格看做阶梯,棋子看做硬币, ...

  2. python改文件名

    import os file_names = os.listdir('D:\\mobilefile\\_hd') for file_name in file_names : print(file_na ...

  3. 图论分支-Tarjan初步-点双连通分量

    上一次我们讲到了边双,这次我们来看点双. 说实话来说,点双比边双稍微复杂一些: 学完边双,我们先看一道题 第一问都不用说了吧,多余的道路,明显的割边. 是不是首先想到用边双,但是我们来看一个图: 有点 ...

  4. 图论分支-Tarjan初步-边双联通分量

    本来应该先说强连通分量,但是有一定的分配,所以这个在下一篇博客将会见到. 这个本想连点连通分量一起讲,但是量有点大,所以我就分两步讲. 我们先看定义 再来看看图解 很容易就能发现,只要将割边断掉,然后 ...

  5. python并发编程(并发与并行,同步和异步,阻塞与非阻塞)

    最近在学python的网络编程,学了socket通信,并利用socket实现了一个具有用户验证功能,可以上传下载文件.可以实现命令行功能,创建和删除文件夹,可以实现的断点续传等功能的FTP服务器.但在 ...

  6. Centos7使用kubeadm 安装多主高可用kubernets:v.1.11集群

    实验环境介绍: 本次实验环境是5个节点 3台master 2台node节点: k8smaster01 192.168.111.128 软件:etcd k8smaster haproxy keepali ...

  7. python 正则表达式re模块

    #####################总结##############    优点:  灵活, 功能性强, 逻辑性强.               缺点:  上手难,旦上手, 会爱上这个东西    ...

  8. idea上使用maven模块开发

    使用maven模块开发: 使用Maven构建多模块项目 在平时的Javaweb项目开发中为了便于后期的维护,我们一般会进行分层开发,最常见的就是分为common(域模型层).dao(数据库访问层).s ...

  9. C#窗口编程时TextBox中的换行

    注意Windows下的换行符是\r\n.只使用\n是无法完成换行的

  10. Python 连接MongoDB并比较两个字符串相似度的简单示例

    本文介绍一个示例:使用 pymongo 连接 MongoDB,查询MongoDB中的 字符串 记录,并比较字符串之间的相似度. 一,Python连接MongoDB 大致步骤:创建MongoClient ...