目前我有一个活动,片段正在添加到它(搜索,歌曲细节,设置等)。我实现了基于侧面的菜单导航,所以现在,作为一个副作用,tehre没有限制多少片段添加到Backstack。**是否有任何方法可以限制片段的数量,或删除旧条目?**例如,每个歌曲细节片段都有一个推荐歌曲列表,通过该列表您可以转到另一个歌曲细节片段。在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->退出。
我刚刚去了8个级别的深度测试:A->B->C->D->E->F->G->H,从H返回,同样的事情发生了:H->B->A->退出。
所有的Fragments都是通过上面的方法添加的。我想看到的是:H->G->F->退出。
3条答案
按热度按时间toiithl61#
你可以通过编程控制BackStack中的Fragment数量:
只需检查Backstack中有多少Fragment,如果有“溢出”,请删除。
如果要从BackStack中删除特定的Fragment,则需要实现自己的BackStack并覆盖onBackPressed()。由于Fragment BackStack是一个Stack(顾名思义),因此只能删除顶部元素(最后添加的元素),不可能删除中间的Fragment。
例如,您可以使用
实现自己的堆栈。只要你愿意,就可以在这个“堆栈”(它不再是一个真正的堆栈)中添加和删除Fragment,并通过覆盖onBackPressed()方法来处理以前的fragment的加载。
xiozqbni2#
这是一个老问题,但我的回答可能会帮助一些人。
为什么不检查片段是否在堆栈中并弹出它呢?这样你就不必担心回退栈的大小(除非你有很多碎片)。
pb3s4cty3#
对于任何仍在寻找解决方案的人来说,可以尝试一下。在添加片段之前放置此代码。代码是用Kotlin写的
剩下的代码在这里……