目前我有一项活动,并且正在向其中添加片段(搜索、歌曲详细信息、设置等)。我实现了基于侧面的菜单导航,因此现在,作为副作用,添加到 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(使用前将#替换为@)