Android 删除最早提交的后台堆栈片段

Android 删除最早提交的后台堆栈片段,android,android-fragments,memory,fragmentmanager,Android,Android Fragments,Memory,Fragmentmanager,我有一个导航抽屉菜单(只有几个项目),可以调用切换片段,如下所示: FragmentTransaction trans = fragmentManager .beginTransaction() .setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right) .replace(R.id.container, newFrag

我有一个导航抽屉菜单(只有几个项目),可以调用切换片段,如下所示:

 FragmentTransaction trans = fragmentManager
            .beginTransaction()
            .setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_out_right)
            .replace(R.id.container, newFragment)
            .addToBackStack(String.valueOf(item.Index)); // item.Index is clicked nav. drawer item index

    trans.commit();
现在,当用户使用抽屉在应用程序中导航时,后堆栈不断增长。当堆栈中有很多项(比如>30或类似的东西)时,会使用一些内存,这是我不喜欢的,因为有一种危险,在某个时候它会达到临界点,我会得到OOMEException


那么,有没有办法从后堆栈中删除最旧的项目?我不想使用
popbackbackstack()
(以及类似的工具),因为它会删除最新的项目,我想删除第一个(最旧的)项目,因为用户可能不记得他/她之前10次导航的位置。

我认为可以通过以下方法删除前10个片段

    if (getSupportFragmentManager().getFragments() != null && getSupportFragmentManager().getFragments().size() > 30) {
        Iterator itr = getSupportFragmentManager().getFragments().iterator();
        int index = 0;
        //REMOVE FIRST 10 fragments on Stack
        while (itr.hasNext()) {
            if (index < 10) {
                itr.remove();
            }else {
                    break;
            }
            index++;
        }
    }
if(getSupportFragmentManager().getFragments()!=null&&getSupportFragmentManager().getFragments().size()>30){
迭代器itr=getSupportFragmentManager().getFragments().Iterator();
int指数=0;
//移除堆栈上的前10个片段
while(itr.hasNext()){
如果(指数<10){
itr.remove();
}否则{
打破
}
索引++;
}
}

我找到了某种解决方法,所以我将回答我自己的问题,也许有人会发现它很有用

由于无法从
FragmentManager
中删除最旧的堆栈,我决定将其丢弃,并使用我自己的“后堆栈”实现

详情如下:

我很惊讶它无法工作,因为
getSupportFragmentManager().getFragments()
不再可用。当您使用AppCompatActivity扩展您的活动时,超出了它的可用范围。我的意思是我们不应该使用
getSupportFragmentManager().getFragments()
因为它被标记为隐藏和内部:文档中也没有
getFragments()
:最后,查看
FragmentManager
源代码,似乎还有一些额外的结构(
FragmentManager.BackStackEntry
)也应该删除。仅删除
片段
s可能太少。