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

7ivaypg9  于 2023-05-27  发布在  Android
关注(0)|答案(3)|浏览(140)

目前我有一个活动,片段正在添加到它(搜索,歌曲细节,设置等)。我实现了基于侧面的菜单导航,所以现在,作为一个副作用,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->退出。

toiithl6

toiithl61#

你可以通过编程控制BackStack中的Fragment数量:

FragmentManager fm = getActivity().getSupportFragmentManager();

if(fm.getBackStackEntryCount() > 10) {

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

只需检查Backstack中有多少Fragment,如果有“溢出”,请删除。

如果要从BackStack中删除特定的Fragment,则需要实现自己的BackStack并覆盖onBackPressed()。由于Fragment BackStack是一个Stack(顾名思义),因此只能删除顶部元素(最后添加的元素),不可能删除中间的Fragment。

例如,您可以使用

ArrayList<Fragment>

实现自己的堆栈。只要你愿意,就可以在这个“堆栈”(它不再是一个真正的堆栈)中添加和删除Fragment,并通过覆盖onBackPressed()方法来处理以前的fragment的加载。

xiozqbni

xiozqbni2#

这是一个老问题,但我的回答可能会帮助一些人。
为什么不检查片段是否在堆栈中并弹出它呢?这样你就不必担心回退栈的大小(除非你有很多碎片)。

String backStateName = fragment.getClass().getName();
    boolean fragmentPopped = false;
    try {
        // true if fragment is in the stack
        fragmentPopped = fragmentManager.popBackStackImmediate(backStateName, 0);
    } catch (Exception e) {
        e.printStackTrace();
    }

    FragmentTransaction ft = fragmentManager.beginTransaction();

    if ( !fragmentPopped ) { //fragment not in back stack, add it...            
        ft.setTransition( FragmentTransaction.TRANSIT_FRAGMENT_FADE );
        ft.replace(R.id.main, fragment);
        ft.addToBackStack( backStateName );

        try {
            ft.commit();
        } catch (Exception e) {
            e.printStackTrace();
        }           
    }
pb3s4cty

pb3s4cty3#

对于任何仍在寻找解决方案的人来说,可以尝试一下。在添加片段之前放置此代码。代码是用Kotlin写的

val c = supportFragmentManager.backStackEntryCount-1
If(c>-1){
For(I:Int in 0 until c){
val entry=supportFragmentManager.getBackStackEntryAt(I)
if(entry.name =="name used for commit"){
supportFragmentManager.popBackManager(entry.id,0)
return
}
}
}

剩下的代码在这里……

相关问题