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

Sta*_*wed 7 android back-button android-fragments android-activity

目前我有一个活动,并且正在添加片段(搜索,歌曲详细信息,设置等).我实现了基于侧面的菜单导航,所以现在,作为副作用,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();
}
Run Code Online (Sandbox Code Playgroud)

我只是试了一下,假设我的片段历史是:A-> B-> C-> D,从D回来,去B-> A->退出.

我只是进了8级测试:A-> B-> C-> D-> E-> F-> G-> H,从H回来,同样的事情发生了:H-> B-> A- >退出.

所有碎片都是通过上面的方法添加的.我想看到的是:H-> G-> F->退出.

Phi*_*oda 11

您可以以编程方式控制BackStack中的碎片数量:

FragmentManager fm = getActivity().getSupportFragmentManager();

if(fm.getBackStackEntryCount() > 10) {

   fm.popBackStack(); // remove one (you can also remove more)
}
Run Code Online (Sandbox Code Playgroud)

只需检查Backstack中有多少碎片,如果有"溢出"则删除.

如果要从BackStack中删除特定的碎片,则必须实现自己的BackStack并覆盖onBackPressed().由于Fragment BackStack是一个Stack(如名称所示),因此只能移除顶部元素(最后添加的元素),因此不可能在其间删除Fragments.

你可以使用例如

ArrayList<Fragment>
Run Code Online (Sandbox Code Playgroud)

实现自己的堆栈.只要你想要并通过覆盖onBackPressed()方法来处理先前片段的加载,只需添加和删除那个"堆栈"中的碎片(它不再是堆栈).