首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在调用popbackstack()之后,所有添加的片段都会显示出来,为什么?

在调用popbackstack()之后,所有添加的片段都会显示出来的原因是因为popbackstack()方法会将Fragment事务回退到指定的状态,但并不会立即执行回退操作。相反,它会将回退操作添加到Fragment事务的回退栈中,并在下一次执行事务时才会执行回退操作。

当调用popbackstack()方法后,FragmentManager会检查回退栈中的事务,并将最近的一个事务执行回退操作。这意味着之前添加的片段将会重新显示出来,因为它们的状态被还原到了添加时的状态。

需要注意的是,popbackstack()方法只会执行一次回退操作,如果希望连续执行多次回退操作,需要多次调用popbackstack()方法。

总结起来,调用popbackstack()方法后,所有添加的片段都会显示出来,是因为该方法将回退操作添加到了Fragment事务的回退栈中,并在下一次执行事务时才会执行回退操作,从而还原之前添加的片段的状态。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • Fragment 基础知识

    如果一个fragment已经进来的话,再次添加的话会报异常错误的 添加进来的fragment都是可见的(visible),后添加的fragment会展示在先添加的fragment上面,在绘制界面的时候会绘制所有可见的...: 如果我们使用replace来切换页面,那么在每次切换的时候,Fragment都会重新实例化,重新加载一边数据,这样非常消耗性能和用户的数据流量。...这是因为replace操作,每次都会把container中的现有的fragment实例清空,然后再把指定的fragment添加进去,就就造成了在切换到以前的fragment时,就会重新实例会fragment...:由于是将fragment添加到ADD队列,所以只能添加到列队头部,所以attach()操作的结果是,最新操作的页面始终显示在最前面,由于这里会将fragment添加到Activity的ADD队列中,所以在这里调用...也就是说在activity调用了onSaveInstanceState()之后,再commit一个事务就会出现该异常。

    67720

    Android 多返回栈技术详解

    这就意味着当您调用 commit() 提交了一个调用过 addToBackStack() 方法的 Fragment 事务时,FragmentManager 会执行所有您在事务中所指定的操作 (比如 替换操作...当您调用 popBackStack() 方法时 (无论是直接调用,还是通过系统返回键以 FragmentManager 内部机制调用),Fragment 返回栈的最上层事务会从栈中弹出 -- 比如新添加的...也就是说 popBackStack() 变成了销毁操作: 任何已添加的 Fragment 在事务被弹出的时候都会丢失它的状态。...然而,当您使用多返回栈时,name 的作用就非常重要了: 在您调用 saveBackStack() 和之后的 restoreBackStack() 方法时,它将作为 Fragment 事务的唯一的 key...△ 我们保存 profile 返回栈并且添加一个新的 commit 后的 FragmentManager 状态 替换回来非常简单: 我们可以在 "notifications" 事务中同样调用 saveBackStack

    96910

    Android技能树 — Fragment总体小结

    老样子,先上脑图: 我们就按照脑图的顺序一样样来看Fragment的基础知识。 正文: 1.Fragment的添加 我们知道Fragment是一个"碎片(或者片段)",添加在Activity中。...然后网上有很多教程,叫你提交的时候使用commitAllowingStateLoss()方法,虽然说不会抛出错误,但是如果在Activity已经保存状态完之后提交了它,到时候Ativity意外崩溃,再恢复数据的时候就不会恢复在...Activity保存状态之后提交的fragment的更新,造成状态丢失了。...如果想要立即执行,可以在commit之后立即调用FragmentManager的executePendingTransactions()方法. 2. commit()方法必须在状态存储之前调用,否则会抛出异常...,原先的Fragment的字段值将会全部丢失(因为当切换横竖屏时,Fragment会调用自己的无参构造函数,那么在构造函数传参就会失效),但是通过 Fragment.setArguments(Bundle

    35310

    Fragment回退栈及弹出方法

    一、回退栈 在前面两期的示例中,当我们完成一些操作后,如果想要回到操作之前的状态,一般我们都会按返回键,如下图所示: ?...默认情况下,Fragment事务是不会加入回退栈的,如果想将Fragment加入回退栈并实现事物回滚,首先需要在commit()方法之前调用事务的以下方法将其添加到回退栈中: addToBackStack...这里在Fragment添加、删除、替换案例的基础来进行学习,布局代码和Fragment代码不变,只需要在MainActivity的onClick方法中增加一行代码即可,代码如下: public class...这就需要我们来多了解事物回滚的相关原理,其实在Fragment回退时,默认调用FragmentManager的 popBackStack() 方法将最上层的操作弹出回退栈。...使用popBackStack()来弹出栈内容的话,调用该方法后会将事物操作插入到FragmentManager的操作队列,只有当轮询到该事物时才能执行。

    4.6K70

    Android技能树 — Fragment总体小结

    我们就按照脑图的顺序一样样来看Fragment的基础知识。 ---- 正文: 1.Fragment的添加 ? 我们知道Fragment是一个"碎片(或者片段)",添加在Activity中。...然后网上有很多教程,叫你提交的时候使用commitAllowingStateLoss()方法,虽然说不会抛出错误,但是如果在Activity已经保存状态完之后提交了它,到时候Ativity意外崩溃,再恢复数据的时候就不会恢复在...Activity保存状态之后提交的fragment的更新,造成状态丢失了。...如果想要立即执行,可以在commit之后立即调用FragmentManager的executePendingTransactions()方法. 2. commit()方法必须在状态存储之前调用,否则会抛出异常...,原先的Fragment的字段值将会全部丢失(因为当切换横竖屏时,Fragment会调用自己的无参构造函数,那么在构造函数传参就会失效),但是通过 Fragment.setArguments(Bundle

    1.1K20

    Navigation深入浅出,到出神入化,再到实战改造

    思考几个问题: 可以在代码中用Bundle传递参数,为什么要在XML去配置 XML中的参数标签,只能设置和读取,无法在XML中跳转是附带传过去,如B页面要求传入name:String,于是在popBackStack()回退上一级时有什么区别,该如何正确使用 跳转时 有时用的是Action的ID,有时用的是Fragment的ID 他俩到底在什么场景下,区分该将哪个传入方法作为参数...: 上一节点回退栈到当前节点的动画 Pop To 按返回键会调用 navController.navigationUp或navController.popBackStack()时,想回退定向到那个节点...这个类 NavHostFragment是Navigation提供的默认容器,所有路由逻辑都经过这里,然后在分发出去 3....A,B页面都会进入Login页面,但它们有不同的权限,所以可以配置不同的type,且这种配置基本不会变化。 4.

    60510

    Fragment全解析系列(一):那些年踩过的坑

    getActivity()空指针 可能你遇到过getActivity()返回null,或者平时运行完好的代码,在“内存重启”之后,调用getActivity()的地方却返回null,报了空指针异常...比如:你在pop了Fragment之后,该Fragment的异步任务仍然在执行,并且在执行完成后调用了getActivity()方法,这样就会空指针。...解决办法: 更"安全"的方法:(对于Fragment已经onDetach这种情况,我们应该避免在这之后再去调用宿主Activity对象,比如取消这些异步任务,但我们的团队可能会有粗心大意的情况...详细原因:从源码角度分析,为什么会发生Fragment重叠?...(如果是replace,恢复形式和Activity一致,只有当你pop之后上一个Fragment才开始重新恢复,所有使用replace不会造成重叠现象) v4-24.0.0+ 开始,官方修复了上述 没有保存

    3.2K20

    Android开发之Fragment回退栈

    在Android开发之Fragment动态使用一文中,说到replace方法切换Fragment,会造成Fragment不断销毁、创建,但是有没有办法实现像Activity一样通过栈的方式来管理Fragment...一、Fragment回退栈 Activity切换时,相信大家都知道是通过栈的形式,不断压栈出栈,在Fragment的时候,如果你不是手动开启回退栈,它是直接销毁再重建,但如果将Fragment任务添加到回退栈...(); //fl为占位布局 ft.add(R.id.fl, f1); ft.commit(); 3、Fragment1中按钮事件,将当前的事务添加到了回退栈 Fragment2 f2 = new Fragment2...回退栈Fragment3返回Fragment2.PNG 此时注意Fragment2的生命周期,执行了onCreateView()但未执行onCreate(),因为它只是将界面显示出来了,并没有创建新的实例...,每添加一次回退栈该数会加1

    1.3K40

    Android基础:Fragment,看这篇就够了

    在Activity中添加Fragment的方式有两种: 静态添加:在xml中通过的方式添加,缺点是一旦添加就不能在运行时删除。...首先,onSaveInstanceState()在onPause()之后,onStop()之前调用。...Fragment的onResume()在Activity的onResume()之后调用。 接下去分两种情况,分别是不加addToBackStack()和加addToBackStack()。...这里说的弹出所有元素包含回退这些事务。 popBackStack()是异步执行的,是丢到主线程的MessageQueue执行,popBackStackImmediate()是同步版本。...因为setUserVisibleHint(true)在界面可见时都会调用,如果滑到该界面做过数据加载后,滑走,再滑回来,还是会调用setUserVisibleHint(true),此时由于mIsInited

    4.9K122

    《Android基础:Fragment,看这篇就够了》

    首先,onSaveInstanceState()在onPause()之后,onStop()之前调用。...Fragment的onResume()在Activity的onResume()之后调用。 接下去分两种情况,分别是不加addToBackStack()和加addToBackStack()。...是在主线程执行的,mExecCommit的内部就是调用了execPendingActions(),即把mPendingActions中所有积压的没被执行的事务全部执行。...这里说的弹出所有元素包含回退这些事务。 popBackStack()是异步执行的,是丢到主线程的MessageQueue执行,popBackStackImmediate()是同步版本。...因为setUserVisibleHint(true)在界面可见时都会调用,如果滑到该界面做过数据加载后,滑走,再滑回来,还是会调用setUserVisibleHint(true),此时由于mIsInited

    4K62

    再看LayoutInflater,这次你可能又会有新的认识

    但是前面也说了,一个布局如果没有父布局的话没办法显示出来呀,所以我们又使用了addView()方法将它添加到了一个现有布局当中。...更准确点来讲,所有以layout_开头的属性都会失去作用。...为什么修改第三个参数之后会出现这样的错误呢?我们现在就来分析一下。 首先关注一下第三个参数的名字是什么,attachToRoot。从字面意思上看,是在问我们是否要添加到root上面。...,就是在问我们要不要将当前加载的xml布局添加到第二个参数传入的父布局上面。...所以在刚才的代码当中,我们一开始在inflate()方法的第三个参数中传入false,那么button_layout.xml布局是不会被添加到mainLayout当中的,我们后面就可以手动调用addView

    63100

    Android入门教程 | Fragment 基础概念

    例如,当 Activity 暂停时,Activity 的所有片段也会暂停;当 Activity 被销毁时,所有片段也会被销毁。...通过 popBackStack()(模拟用户发出的返回命令)使片段从返回栈中弹出。 通过 addOnBackStackChangedListener() 注册侦听返回栈变化的侦听器。...如果向事务添加多个更改(如又一个 add() 或 remove()),并调用 addToBackStack(),则调用 commit() 前应用的所有更改都将作为单一事务添加到返回栈,并且返回按钮会将它们一并撤消...向 FragmentTransaction 添加更改的顺序无关紧要,不过: 必须最后调用 commit()。 如果要向同一容器添加多个片段,则添加片段的顺序将决定它们在视图层次结构中出现的顺序。...宿主 Activity 已停止,或片段已从 Activity 中移除,但已添加到返回栈。已停止的片段仍处于活动状态(系统会保留所有状态和成员信息)。

    3.5K40

    Android | Jetpack 处理回退事件的新姿势 —— OnBackPressedDispatcher

    OnBackPressedDispatcher 的整体处理流程: 分发器整体采用责任链设计模式,向分发器添加的回调对象都会成为责任链上的一个节点。...答:分发器整体采用责任链设计模式,向分发器添加的回调对象都会成为责任链上的一个节点。当用户触发返回键时,将按顺序遍历责任链,如果回调对象是启用状态(Enabled),则会消费该回退事件,并且停止遍历。...另外,添加回调的 addCallback() 方法也要求在主线程执行,分发器内部使用非并发安全容器 ArrayDeque 存储回调对象。...该 API 在 API 16 后引入,最好通过 ActivityCompat.finishAffinity() 调用。...该 API 在 API 21 后引入,最好通过 ActivityCompat.finishAfterTransition() 调用。 ---- 5.

    1.7K20

    Android Compose 新闻App(八)抽屉布局、动态权限、拍照返回

    一、完善新闻数据 那么首先你需要去天行API中去请求相应的数据接口,请求之后将这些接口调试一下你就会发现,这五个接口返回的数据类型一致,就是我们在社会新闻中返回的数据结构,那就可以直接复用。...newslist) } 添加的代码如下图所示: 下面我们运行一下: 你会发现了这里的军事数据的图片没有显示出来,我们通过地址看到picUrl的值是空字符串...) 添加位置如下图所示: 由于疫情新闻页面我并没有在TopBar中写返回按钮,因此我们可以通过疫情新闻页面的浮动按钮点击返回到当前的主页面, 代码如下: mNavController.popBackStack...>(null) } mCameraUri用于保存拍照返回的图片,imageUir 用于显示在页面上,然后我们可以写出这样的代码: //TakePicture 调用相机,拍照后将图片保存到开发者指定的...赋值之后就会触发这个data,然后就会加载图片的uri,就能显示出来了。

    2.3K20

    Jetpack路由组件学习:深入理解功能强大的Navigation架构之接管系统的返回操作

    关于真正的跳转原理,之后会出专文讲解,敬请关注本公众号,及时获取更文通知。 第二个问题,在不深入理解源码的情况下,如果被问到,我会直接被问懵。难道是重写onBackPressed()?...但是很吊诡地是,翻遍所有的技术社区,都很难找到讲解它的文章。但是它真的很重要,它是Navigation组件的基础设施(水和电)。...FragmentActivity1没有调用addToBackStack()方法,而FragmentActivity2调用了。...image.png 「case->popBackStack(null,0)」 image.png 「case2->popBackStack(“s2”,0)」 image.png 「case3->popBackStack...我写得再详细,也有遗漏的细节未能表达出来,你读得再认真,不实践一把,你也未必能够真正明白所有的技术要点。所以建议阅读完文章,深入源码实践一把,把文章中的知识,转化成自己的东西。

    1.4K30

    实践 | Google IO 应用是如何适配大尺寸屏幕 UI 的?

    在程序运行过程中,我们可以通过 Kotlin 的安全调用操作符 (?.) 来根据当前的设备配置确定呈现给用户哪一个视图。...} ... } 小贴士: 即使您不需要数据绑定的所有功能,您仍然可以使用 视图绑定 来为您的布局生成绑定类,这样就能避免调用 findViewById 了。...双窗格会一直存在,但根据屏幕的尺寸,第二窗格可能不会显示在可视范围当中。只有在给定的窗格宽度下仍然有足够的空间时,SlidingPaneLayout 才会同时将两者显示出来。...剩下要做的就是当我们知道窗格有多宽之后,选择要 inflate 的桩。...在应用运行时,数据绑定会调用下面的函数,并将解析自资源文件的值作为参数传进去。

    2.1K20

    Jetpack Compose之 在Compose中使用Navigation导航

    已经发布了稳定版本,还没学会Compose让我的头发又白了许多~ 使用Navigation在Compose中导航 如果你之前不喜欢Android提倡的”单Activity“应用,那么在Compose中相信你会慢慢习惯的...在页面2中调用popBackStack方法将当前页面出栈便又回到了页面1,这里就不贴页面2的代码了。...当然我们要记得最后一步:在入口处调用 NavHostDemo() setContent {     NavigationTheme {         // A surface container using..."/"拼写在路由地址后面添加占位符即可,默认情况下,所有的参数都会被解析成字符串,所以我们可以使用arguments来为参数指定type类型。...所以占位符的方式相当于必传参数,如果不传的话则会抛出异常,那么,如果我们想将参数设置为可选参数应该怎么样做呢? 可选参数 可选参数类似于get请求的添加方式 ?

    2K20
    领券