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();
这样就没有问题并且能够退回
- getFragmentManager().beginTransaction()
思考: 为什么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);
- }
- @Override
可以看出:是否加入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;
- }
- @Override
我的异常也是爆了这里有错误: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,也就 ...
随机推荐
- shell 获取当前目录下的jar文件
1.示例 function getDir() { ` do fileName=$"/"$item if [ -d $fileName ] then echo $fileName&q ...
- zui框架配置日期控件只显示年月
zui框架配置日期控件datetimepicker只显示年月 <!DOCTYPE html> <head> <script src="~/Scripts/jqu ...
- Docker详解(四) — Dockerfile剖析
目录 1.Dockfile简介 2. Dockerfile构建过程解析 3. Dockerfile体系结构 4. 案例 4.1 自定义mycentos 4.2 CMD/ENTRYPOINT 镜像案例 ...
- ng service(服务)
ng service(服务) 创建服务命令:ng g service services/+服务名 使用服务的注意事项: 使用(services)服务需要在app.,module.ts(根模块)中引用并 ...
- postgres 数据库 citus 集群分片
前言 什么时候需要考虑做数据切分? 1.能不切分尽量不要切分 并不是所有表都需要进行切分,主要还是看数据的增长速度.切分后会在某种程度上提升业务的复杂度,数据库除了承载数据的存储和查询外,协助业务更好 ...
- python语言程序设计基础(嵩天)第四章课后习题部分答案
p121: *题4.1:猜数字游戏.在程序中预设一个0~9之间的整数,让用户通过键盘输入所猜的数,如果大于预设的数,显示“遗憾,太大了!”:小于预设的数,显示“遗憾,太小了!”,如此循环,直至猜中该数 ...
- TouchListener PK OnTouchEvent + 多点触碰
1.基于监听的TouchListener 代码示例: 实现效果图: 实现代码: main.xml <RelativeLayout xmlns:android="http://schem ...
- Ubuntu部署Tomcat Web服务
在Ubuntu平台中安装TomCat 本文将为大家介绍TomCat在Ubuntu平台中如何进行部署使用,带你快速入门使用TomCat TomCat简介 Tomcat是Apache 软件基金会(Apac ...
- KafkaStream低级别API
开发者可以通过Processor接口来实现自己的自定义处理逻辑.接口提供了Process和Punctuate方法. 其中:Process方法用于处理接受到的消息 Punctuate方法指定时间间隔周期 ...
- BZOJ 2535: [Noi2010]Plane 航空管制2
Description 世博期间,上海的航空客运量大大超过了平时,随之而来的航空管制也频频发生.最近,小X就因为航空管制,连续两次在机场被延误超过了两小时.对此,小X表示很不满意. 在这次来烟台的路上 ...