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可能太少。