目前我有一个活动,并且正在添加片段(搜索,歌曲详细信息,设置等).我实现了基于侧面的菜单导航,所以现在,作为副作用,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->退出.
解决方法
您可以以编程方式控制BackStack中的碎片数量:
FragmentManager fm = getActivity().getSupportFragmentManager(); if(fm.getBackStackEntryCount() > 10) { fm.popBackStack(); // remove one (you can also remove more) }
只需检查Backstack中有多少碎片,如果有“溢出”则删除.
如果要从BackStack中删除特定的碎片,则必须实现自己的BackStack并覆盖onBackPressed().由于Fragment BackStack是一个Stack(如名称所示),因此只能删除顶部元素(最后添加的元素),不可能删除它们之间的碎片.
你可以使用例如
ArrayList<Fragment>
实现自己的堆栈.只要你想要并通过覆盖onBackPressed()方法来处理先前片段的加载,只需添加和删除那个“堆栈”中的碎片(它不再是堆栈).