当前位置: 首页 > backend >正文

Android开发之add方式添加Fragment生命周期不响应

根因:

当使用add()方法添加FragmentB时,FragmentA未触发onPause()onStop()是预期行为,原因如下:

  1. Fragment叠加机制
    add()会将FragmentB叠加在FragmentA之上,而非替换。此时FragmentA仍保持‌可见状态‌(仅被覆盖),因此不会进入暂停或停止生命周期阶段。只有完全不可见的Fragment才会触发onStop()回调。

  2. 生命周期状态保留
    通过addToBackStack()将事务加入回退栈后,系统会保留FragmentA的视图和状态。此时FragmentA被视为‌部分可见‌组件,其生命周期仅会触发onHiddenChanged(false)而非完整暂停流程。

  3. replace()的差异
    若需销毁FragmentA并触发完整生命周期,应改用replace()方法。此时会依次调用onPause()onStop()onDestroyView(),但会重建视图导致状态丢失

看下代码解决方案,将下面的代码添加到Activity中

 private fun bindFragment(targetTag: String, block: () -> Fragment) {val fragmentManager = supportFragmentManagerval topFragment = getTopFragment(fragmentManager)LogUtils.w("当前栈顶fragment:${topFragment?.javaClass?.simpleName}")// 先尝试回退到目标Fragmentval popped = fragmentManager.popBackStackImmediate(targetTag, 0)if (!popped) {fragmentManager.beginTransaction()//手动隐藏当前的fragment,让其相应onHiddenChanged生命周期.hide(topFragment!!).add(R.id.login_fragment_container, block(), targetTag)//手动调用onShow让其新添加的fragment强制显示执行onHiddenChanged生命周期方法.show(block()).addToBackStack(targetTag).commit()}}//拿到当前显示的fragmentfun getTopFragment(fragmentManager: FragmentManager): Fragment? {return if (fragmentManager.backStackEntryCount > 0) {val tag = fragmentManager.getBackStackEntryAt(fragmentManager.backStackEntryCount - 1).namefragmentManager.findFragmentByTag(tag)} else {fragmentManager.fragments.lastOrNull()}}

然后在add的fragment中重写onHiddenChanged方法即可监听当前和add的fragment的显示隐藏状态了!

http://www.xdnf.cn/news/19452.html

相关文章:

  • 单例模式
  • Selenium 自动化测试实战:绕过登录直接获取 Cookie
  • 希尔排序。
  • Java面试-微服务(业务问题)
  • QT控件QPlainTextEdit、QTextEdit与QTextBrowser的区别
  • 【秋招笔试】2025.08.31小红书秋招笔试真题
  • 解读数据中台建设汇报方案【附全文阅读】
  • 淘天二面总结
  • 链表算法知识汇总
  • lesson51:CSS全攻略:从基础样式到前沿特性的实战指南
  • 【读论文】量子关联增强双梳光谱技术
  • RabbitMinQ(模拟实现消息队列项目)02
  • 【零碎小知识点 】(四) Java多线程编程深入与实践
  • Spring Cloud ------ Gateway
  • 阿里Qoder怎么样?实测对比TRAE SOLO 和 CodeBuddy IDE
  • 【甲烷数据集】全球逐日无缝隙柱平均干空气甲烷浓度(XCH₄)
  • Solid Explorer文件管理器:功能强大的安卓文件管理器及网盘文件管理器
  • FFMPEG AAC
  • 【MySQL详解】索引、事务、锁、日志
  • 【MySQL基础】MySQL核心操作全解析
  • GPT - 5 技术前瞻与开发者高效接入路径探索​
  • Java-113 深入浅出 MySQL 扩容全攻略:触发条件、迁移方案与性能优化
  • Java实现图像像素化
  • VirtualBox7.2安装步骤
  • RT-DETR网络结构
  • 开源 C# .net mvc 开发(九)websocket--服务器与客户端的实时通信
  • LangChain VectorStores核心:多向量数据库统一交互层与RAG存储中枢
  • 云原生新手入门完整学习指南
  • 14:00面试,15:00就出来了,问的问题过于变态了。。。
  • 【面试场景题】100M网络带宽能不能支撑QPS3000