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

Fragment如何实现Activity栈的压栈和出栈

更多面试题请看这里:https://interview.raoyunsoft.com/
Fragment本身没有独立的栈管理能力,但通过FragmentManagerFragmentTransaction可以模拟类似Activity栈的压栈(push)和出栈(pop)行为。核心是通过回退栈(BackStack)机制实现层级导航管理。


一、关键实现机制
  1. 回退栈(BackStack)

    • 通过addToBackStack(tag)将事务加入回退栈
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.container, new DetailFragment());
    transaction.addToBackStack("detail_fragment"); // 关键:压栈操作
    transaction.commit();
    
  2. 出栈触发方式

    • 用户操作:点击系统返回键自动触发出栈
    • 代码控制:主动调用popBackStack()
    // 弹出栈顶Fragment
    getSupportFragmentManager().popBackStack(); // 弹出指定tag的Fragment(包含其上的所有Fragment)
    getSupportFragmentManager().popBackStack("home_fragment", 0);
    
  3. 栈管理API

    方法作用参数说明
    getBackStackEntryCount()获取栈中事务数量-
    getBackStackEntryAt(index)获取指定位置的事务index:栈位置
    popBackStackImmediate()立即执行出栈-

二、完整压栈/出栈流程示例

场景:从主页(HomeFragment)跳转到详情页(DetailFragment)

// 1. 压栈操作(Home → Detail)
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();// 添加新Fragment并隐藏旧Fragment
transaction.hide(homeFragment);
transaction.add(R.id.container, detailFragment);// 加入回退栈(关键步骤)
transaction.addToBackStack("detail_transaction");
transaction.commit();// 2. 出栈操作(Detail → Home)
// 方式1:用户点击返回键自动触发
// 方式2:主动调用
manager.popBackStack(); // 弹出栈顶事务

三、栈行为控制技巧
  1. 单例模式入栈
    避免重复添加相同Fragment:

    if (manager.findFragmentByTag("detail") == null) {transaction.add(R.id.container, new DetailFragment(), "detail");transaction.addToBackStack(null);
    }
    
  2. 定向出栈
    跳转到指定层级的Fragment:

    // 弹出直到"home_fragment"(包含该tag之后的所有事务)
    manager.popBackStack("home_fragment", FragmentManager.POP_BACK_STACK_INCLUSIVE);
    
  3. 监听栈变化
    通过FragmentManager.OnBackStackChangedListener

    manager.addOnBackStackChangedListener(() -> {int stackSize = manager.getBackStackEntryCount();Log.d("BackStack", "当前栈深度:" + stackSize);
    });
    

四、与Activity栈的差异
特性Fragment回退栈Activity任务栈
独立性依附于宿主Activity全局独立管理
生命周期与宿主Activity同步自主管理
跨进程不支持支持(Intent跳转)
数据传递通过Bundle/ViewModel通过Intent/Bundle

⚠️ 注意:Fragment回退栈本质是事务记录栈,实际Fragment实例仍由FragmentManager管理。过度使用可能导致内存溢出,建议配合setReorderingAllowed(true)优化事务执行效率。

http://www.dtcms.com/a/486898.html

相关文章:

  • 【组合数学题目】宇宙分解
  • 产品网站开发流程图多店铺开源商城系统
  • 百度收录好的网站免费h5网站制作平台
  • 包头微网站开发wordpress打赏作者插件
  • Rust数据库与工具的选择
  • 淮滨网站制作字体排版网站
  • Spring Boot 3.0 的架构革新:为何弃用 spring.factories 并转向 imports 文件
  • 网站访问密码python报班一般多少钱
  • 渗透测试所需域名和IP信息收集方法
  • TensorFlow2 Python深度学习 - 卷积神经网络示例-使用MNIST识别数字示例
  • LKT4305GM多功能安全芯片
  • 大连网站建设蛇皮果服装设计公司排行
  • 淄博网站建设公司乐达站长工具综合查询官网
  • 7. 从0到上线:.NET 8 + ML.NET LTR 智能类目匹配实战--反馈存储与数据治理:MongoDB 设计与运维
  • C语言基础知识回顾
  • 未来之窗昭和仙君(二十)订单通知提醒——东方仙盟筑基期
  • 网址链接在桌面上创建快捷方式步骤
  • UVa 10766 Organising the Organisation
  • FastDFS 可观测性最佳实践
  • 网站推广在哪些平台做外链广州建工集团有限公司官网
  • Linux中字符串拷贝函数strlcpy的实现
  • PostgreSQL 18 发布
  • DrissionPage下载文件
  • 观澜做网站公司百度seo网站在线诊断
  • 电子商务网站建设题目男女直接做网站
  • 前端 Web 开发工具全流程指南,打造高效开发与调试体系
  • html网站中文模板下载seo营销型网站
  • 【编号220】中国国内生产总值历史数据汇编1952-2021合订本(PDF扫描版)
  • 百度多久收录一次网站北京企业网站建设飞沐
  • 特斯拉前AI总监开源的一款“小型本地版ChatGPT”,普通家用电脑就能运行!