Android_Fragment栈操作 commit()问题分析
栈操作时遇到一个问题
getFragmentManager().beginTransaction()
.replace(R.id.fl_container,bFragment)
.addToBackStack(null).commitNowAllowingStateLoss();
抛出异常:
java.lang.IllegalStateException: This transaction is already being added to the back stack
at androidx.fragment.app.BackStackRecord.disallowAddToBackStack(BackStackRecord.java:561)
at androidx.fragment.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:653)
at com.example.fragmentdemo.AFragment$1.onClick(AFragment.java:65)
看异常:已经被加入栈
那就去掉 .addToBackStack(null) 这句话,能正常显示fragment。但是还有一个就是按返回 或者别的操作要把上一个fragment从 BackStack 中拿出来 。而从fragment的回退栈中取东西 需要用:
supportFragmentManager.popBackStackImmediate();
使用该方法却不能回退
分析:
回退栈中是否有这个fragment:supportFragmentManager.getBackStackEntryCount()
这个方法可以查看fragment回退栈的个数结果显示为0,并没有入栈
解决方案:
getFragmentManager().beginTransaction()
2 .replace(R.id.fl_container,bFragment)
3 .addToBackStack(null).commit();这样就没有问题并且能够退回
思考: 为什么commitNowAllowingStateLoss()这个方法不能入栈
首先fragment事物的提交方式有四种: /**
* 摘出其中的关键点
* it will be scheduled as work on the main thread
* to be done the next time that thread is ready.
* 不会立即执行 而是通过调度器有序的在主线程被执行
* 显然是可以被加入back stack
**/
public abstract int commit(); /**
* 该方法是 commit的加强版 支持在activity非活跃状态下提交事物
**/
public abstract int commitAllowingStateLoss(); /**
* Transactions committed in this way may not be added to the
* FragmentManager's back stack
* 了解到 这个方法 提交的fragment是不会被添加到 FragmentManager's back stack
**/
public abstract void commitNow(); /**
* 1类似commitNow();类似到什么程度呢?就是不会把fragment 加入fragment back stack栈。 看来是个加强版
* 2 the commit can be lost if the activity needs to later be restored from its state,
* 这个方法可以 在activity状态改变之后使用在activity非active状态的情况下是可以提交 并不会报错的
* 了解到 这个方法 提交的fragment是不会被添加到 FragmentManager's back stack
**/
public abstract void commitNowAllowingStateLoss();
切入点:进入commitNowAllowingStateLoss这个方法看看怎么写的,我们看注释只能知其表,想知其理就需要看
FragmentTransaction
的实现类BackStackRecord
@Override
public int commit() {
return commitInternal(false);
} @Override
public int commitAllowingStateLoss() {
return commitInternal(true);
} @Override
public void commitNow() {
disallowAddToBackStack();
mManager.execSingleAction(this, false);
} @Override
public void commitNowAllowingStateLoss() {
disallowAddToBackStack();
mManager.execSingleAction(this, true);
}可以看出:是否加入BackStack取决于
disallowAddToBackStack()
方法@Override
public FragmentTransaction disallowAddToBackStack() {
if (mAddToBackStack) {
throw new IllegalStateException(
"This transaction is already being added to the back stack");
}
mAllowAddToBackStack = false;
return this;
}我的异常也是爆了这里有错误:disallowAddToBackStack(BackStackRecord.java:600)和切入点吻合
Android_Fragment栈操作 commit()问题分析的更多相关文章
- ElasticSearch Index操作源码分析
ElasticSearch Index操作源码分析 本文记录ElasticSearch创建索引执行源码流程.从执行流程角度看一下创建索引会涉及到哪些服务(比如AllocationService.Mas ...
- 一文教你搞懂 Go 中栈操作
转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com/archives/513 本文使用的go的源码15.7 知识点 LInux 进程在内存布 ...
- Python模拟入栈出栈操作
目标: 1.编写菜单,提示用户操作选项(push,pop,view,quit) 2.规则:定义列表,先入栈,后出栈,后入栈,先出栈 1.模拟入栈.出栈操作 >>> list1 = [ ...
- 第一回写的用arraylist模拟栈操作
package hashMap; import java.util.ArrayList; import d.Student; /** * 用ArrayList模拟栈操作 * @author zhuji ...
- c语言学习,模拟栈操作
1.stack.c模拟栈操作函数的实现 #include<stdio.h> #include<stdlib.h> ; static char *stack;//数据栈 ;//栈 ...
- JavaScript中的栈及通过栈操作的实例
<script> /*栈操作*/ function Stack() { this.dataStore = []; this.top = 0; this.push = push; this. ...
- php实现栈操作(不用push pop 库函数)
直接上代码 <?php /*php不用库函数实现栈操作 * @author Geyaru 2019-04-20 */ class stack{ private $top = -1; //栈指针初 ...
- Lua和C++交互 学习记录之二:栈操作
主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍) 部分内容查阅自:<Lua 5.3 参考手册>中文版 译者 云风 制作 Kavcc vs2013+lua-5.3.3 1 ...
- 如何仅用递归函数和栈操作逆序一个栈——你要先用stack实现,再去改成递归——需要对递归理解很深刻才能写出来
/** * 如何仅用递归函数和栈操作逆序一个栈 * 题目: * 一个栈依次压入1,2,3,4,5,那么从栈顶到栈底分别为5,4,3,2,1. * 将这个栈转置后,从栈顶到栈底为1,2,3,4,5,也就 ...
随机推荐
- eShopOnContainers学习系列(一):Swagger的使用
最近在看eShopOnContainer项目,抽取一下其中的基础知识点,做个记录,有兴趣的可以看下. 新建一个.net core API项目,添加Nuget包 Swashbuckle.AspNetCo ...
- 遇到不支持的 Oracle 数据类型 USERDEFINED
以前都是sql查询mdb空间数据没有什么问题,今天在用sql方式查询Oracle中的空间数据时候,出现错误.它不支持geometry.空间数据都带有shape属性.只要不查询shape字段就没问题.但 ...
- Python3 Linux安装(Redhat)
Python3 Linux安装(Redhat): 下载Python-3.6.4.tgz: https://www.python.org/downloads/release/python-364/ Y ...
- 2019.10.15 CSP初赛知识点整理
初赛需要的知识点整理如下: (1)计算机的硬件组成与基本常识 (2)单位/进制的转换 (3)进制/逻辑运算相关 (4)概率与期望 (5)排序的各种性质 (6)简单数据结构的使用(栈.队列.链表等) ( ...
- C语言基于窗体命令行打包,解包和浏览程序
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<windows.h>#inc ...
- 清理 Sketch缓存 Storyist 3.5.1中文破解版 for Mac
Sketch这款软件可以用来做原型和UI设计,很多设计师和产品经理都在用,时间长了以后,Sketch会占据不少缓存空间,这时候可以试试 Sketch Cache Cleaner 这款软件清理历史文件和 ...
- Kubernetes网络插件Flannel的三种工作模式
跨主机通信的一个解决方案是Flannel,由CoreOS推出,支持3种实现:UDP.VXLAN.host-gw 一.UDP模式(性能差) 核心就是通过TUN设备flannel0实现(TUN设备是工作在 ...
- 【前端词典】几个有益的 CSS 小知识
今天偷个懒,不长篇大论,分享几个你可能不知道的 CSS 小知识. 样式的顺序 CSS 代码: HTML 代码: 记得之前这是一道比较火的 CSS 考题,当时好像是有不少的人答错(30% 以上) ...
- HTTPS 验证访问略记
背景 互联网刚刚兴起的时候,网络安全并没有被很好的重视.HTTP 是明文传输的,这为意图谋不道德之事者提供了诸多的便利.当越来越多的人利益受到侵害的时候,开始重视网络传输的安全问题了. HTTPS 加 ...
- PHP reset
1.函数的作用:重置数组内部指针,并返回第一个元素 2.函数的参数: @param array $array 3. 例子一: <?php $arr1 = []; $arr2 = [false, ...