Android - 限制 backStack 中的片段数量?

2024-02-03

目前我有一项活动,并且正在向其中添加片段(搜索、歌曲详细信息、设置等)。我实现了基于侧面的菜单导航,因此现在,作为副作用,添加到 Backstack 的片段数量没有限制。有什么方法可以限制片段的数量,或删除旧的条目?例如,每个歌曲详情片段都有一个推荐歌曲列表,通过它可以转到另一个歌曲详情片段。后台堆栈中很容易有 30 个碎片,如果您打开 DDMS,您可以看到堆大小缓慢(但肯定)增加。

编辑:我尝试做的一件事是,如果用户单击侧面菜单选项之一,如果该片段已经在后台堆栈中,请尝试返回到该片段而不是实例化新片段,但是当然,如​​果用户位于歌曲详细信息页面上,那么他会期望按回键会将他带到该片段,因此这是行不通的。

编辑2: 这是我的 addFragment 方法(以及 Phil 的建议):

public void addFragment(Fragment fragment) { 

        FragmentManager fm = getSupportFragmentManager();
        if(fm.getBackStackEntryCount() > 2) {

              fm.popBackStack();
            }
        fm.beginTransaction()                 
                  .replace(R.id.fragment_container, fragment).addToBackStack("")
                  .commit();
}

我刚刚尝试过,假设我的片段历史记录是:A->B->C->D,从 D 返回,进入 B->A->exit。

我只是深入测试了 8 个级别:A->B->C->D->E->F->G->H,然后从 H 返回,发生了同样的事情:H->B->A- >退出。

所有片段都是通过上面的方法添加的。我希望看到的是:H->G->F->退出。


您可以通过编程控制 BackStack 中的 Fragments 数量:

FragmentManager fm = getActivity().getSupportFragmentManager();

if(fm.getBackStackEntryCount() > 10) {

   fm.popBackStack(); // remove one (you can also remove more)
}

只需检查 Backstack 中有多少 Fragment,如果存在“溢出”,则将其删除。

如果你想删除特定的Fragment从 BackStack 中,您必须实现你自己的BackStack并重写 onBackPressed()。由于Fragment BackStack是一个Stack(顾名思义),因此只能移除顶部元素(最后添加的),不可能移除其间的Fragment。

例如你可以使用

ArrayList<Fragment>

实现你自己的堆栈。只需从该“堆栈”中添加和删除片段(它不再是真正的堆栈)只要您需要并通过重写 onBackPressed() 方法来处理先前片段的加载。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android - 限制 backStack 中的片段数量? 的相关文章

随机推荐

  • 如何编写 IQueryable 来查询递归数据库表?

    我有一个这样的数据库表 Entity ID int PK ParentID int FK Code varchar Text text The ParentID字段是与同一表中另一条记录的外键 递归 所以该结构代表一棵树 我正在尝试编写一种
  • SetPixel 太慢了。有没有更快的方法来绘制位图?

    我正在开发一个小型绘画程序 我在位图上使用 SetPixel 来绘制线条 当画笔尺寸变大 例如 25 像素 时 性能会明显下降 我想知道是否有更快的方法来绘制位图 以下是该项目的一些背景 我使用位图 这样我就可以利用图层 就像在 Photo
  • typedef 函数指针递归

    我试图声明一个采用相同类型的函数作为参数的函数 void rec void f void void f f 我最终进行了递归尝试 您始终可以从void void rec void f void f f 但它不是类型安全的 我尝试用typed
  • 这是过度拟合吗?

    我有一个 CNN 它在训练数据上表现非常好 96 准确率 1 损失 但在测试数据上表现不佳 50 准确率 3 5 损失 泄密者签名过度拟合是指验证损失开始增加 而训练损失持续减少 即 图片改编自维基百科条目过拟合 https en wiki
  • 在configuration.nix中从nixos-unstable安装virtualbox模块

    可以从 nixos unstable 安装软件包 etc nixos configuration nix使用来自的配置这个答案 https stackoverflow com a 48838322 3040129 这是安装的示例htop来自
  • 以等概率从 Pandas 组中随机选择——意外行为

    我尝试从 12 个独特的组中随机抽样 每个组都有不同数量的观察值 我想从整个群体 数据框 中随机抽样 每个组都有相同的被选择概率 最简单的例子是一个包含 2 个组的数据框 groups probability 0 a 0 25 1 a 0
  • Chartjs初始动画想要从左到右改变(默认是从下到上)

    使用chartjs 2 1 4 定制的 默认图表从下到上显示动画 在我们的应用程序画布的下方有两个按钮 左和右 在单击左侧按钮图表动画中想要从右到左 单击右键图表动画想要从左到右显示 请帮我找到解决方案 提前致谢 var myData x
  • HTML5 音频无法通过 Javascript 播放,除非手动触发一次

    我正在尝试使用标签和 JavaScript 来启动一个小声音文件来自动播放
  • ABAP 对象中的“ADD-CORRESPONDING”相当于什么?

    对于以下可执行程序 存在以下语法错误 OO 上下文中不支持 ADD CORRESPONDING 相当于什么ADD CORRESPONDING在ABAP对象中 REPORT CLASS lcl app DEFINITION FOR TESTI
  • terraform init 和 terraform plan 成功运行后,terraform apply 报告 S3 后端配置错误

    我正在我的 Linux 实例上运行 terraform 我遇到了下面的恐怖情况 usr local bin terraform workspace new test enter code here 0m 0m 1m 33mBackend r
  • 为推荐引擎生成测试集

    我正在研究基于隐式反馈的推荐引擎 我正在使用这个链接 http insightdatascience com blog explicit matrix factorization html movielens http insightdat
  • 在 Java 中使用 WSS4j 对肥皂消息进行签名

    我正在编写一个 Java 客户端应用程序 需要签署 SOAP 消息 其中包含 2 个部分 并将其发送到远程服务器 然后再获取响应 我成功地在 SoapUI 中进行了调用 请参阅下面的请求和屏幕截图 我已准备好大部分代码 但我不断从服务器收到
  • 在 CComboBox (MFC) 中设置文本选择

    我有一个 CComboBox 类型DropList 即它不可编辑 通过字符串设置当前选择的最简单方法是什么 我知道我可以使用SetCurSel 按索引设置它 但我希望该函数按字符串搜索列表项并设置它 您可以致电精确查找字符串 https m
  • Django查询集SUM正值和负值

    我有一个模型整数字段称为阈值 我需要得到总计SUM阈值 无论负值如何 vote threshold 100 200 5 result 305 现在我正在这样做 earning 0 result Vote objects all values
  • write_history_file("pyHistory"): 'str' 对象没有属性 'mode'

    我正在关注这个答案 https stackoverflow com a 47595405 2153235将 Python 命令历史记录写入文件 该文件依赖于readline模块和写入历史文件其中的功能 我必须考虑在 Windows 10 上
  • Veins 中汽车和行人之间的通信

    我想知道如何在 Veins 中创建汽车和行人之间的无线通信 V2P 感谢您的关注 Veins 允许为其从 SuMO 获得的车辆类型指定模块 静脉 多种车辆类型的多种应用 https stackoverflow com questions 4
  • 有没有办法在 CSS 计算中包含 pi ?

    我有一个用于进度条的 SVG 圆形动画 其中stroke dashoffset动画来自0 radius to radius 0 0 到 100 圆的周长的方程是pi d 有没有办法使用CSScalc函数可以使用 pi 值 而不仅仅是舍入值
  • 将 MongoDB 与本机驱动程序和 Express.js 结合使用时,“拓扑被破坏”

    我已经实现了从 MongoDB 获取数据的简单应用程序 const express require express const app express const port 3000 const MongoClient require mo
  • 求两个数组中最大的共同元素?

    给定两个数组 如何找到两个数组的最大公共元素 我正在考虑对两个数组 n log n 进行排序 然后对另一个数组中一个已排序数组 从较大的数组开始 中的每个元素执行二分搜索 直到找到匹配项 eg a 1 2 5 4 3 b 9 8 3 Max
  • Android - 限制 backStack 中的片段数量?

    目前我有一项活动 并且正在向其中添加片段 搜索 歌曲详细信息 设置等 我实现了基于侧面的菜单导航 因此现在 作为副作用 添加到 Backstack 的片段数量没有限制 有什么方法可以限制片段的数量 或删除旧的条目 例如 每个歌曲详情片段都有