我想弄清楚如何正确处理导航通过可能指向已删除项目的片段回栈。我想这是一个很常见的情况,但我还没有找到解决方案。如何处理backstack引用已删除的项目
|-----------------------|--------------------------------------------------|--------------------| | Action | Back stack | Location | |-----------------------|--------------------------------------------------|--------------------| | View list | | List | | Go to Details(A) | List | Details(A) | | Go up | List -> Details(A) | List | | Go to Details(B) | List -> Details(A) -> List | Details(B) | | Go up | List -> Details(A) -> List -> Details(B) | List | | Go to Details(A) | List -> Details(A) -> List -> Details(B) -> List | Details(A) | | Delete A (pops stack) | List -> Details(A) -> List -> Details(B) | List | | Go back | List -> Details(A) -> List | Details(B) | | Go back | List -> Details(A) | List | | Go back | List | Details(A) PROBLEM | |-----------------------|--------------------------------------------------|--------------------|
不涉及B项出现,当然同样的问题,它只是指出有问题的项目可能也有点激动堆栈:
|-----------------------|----------------------------|--------------------| | Action | Back stack | Location | |-----------------------|----------------------------|--------------------| | View list | | List | | Go to Details(A) | List | Details(A) | | Go up | List -> Details(A) | List | | Go to Details(A) | List -> Details(A) -> List | Details(A) | | Delete A (pops stack) | List -> Details(A) | List | | Go back | List | Details(A) PROBLEM | |-----------------------|----------------------------|--------------------|
这将是有意义的删除引用删除项目时从后端堆栈删除项目,但据我所知,这不是真正的后端堆栈如何工作。这似乎工作
一个解决办法是流行创造失踪物品的片段时,堆栈,但它会更好不要尝试创建片段在首位的缺失项目:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup viewGroup,
Bundle savedInstanceState) {
if(item == null) {
getFragmentManager().popBackStack();
return null;
}
...
}
我添加最片段是这样的:
getSupportFragmentManager().beginTransaction()
.replace(R.id.container, TheFragment.newInstance(type))
.addToBackStack(null)
.commit();
编辑
决不允许回纳在这种特殊情况下避免这个问题,但我想解决的一般问题是这样的:
假定这些项目有'下一个'选项,并且还有一个'管理项目'视图,可以在导航项目时到达。
从'管理项目'返回,我希望跳回到先前访问的项目。
所以我导航A -> B -> Manage Items
。
从'管理项目'我删除项目A并按回来,弹出到项目B的片段,这很好。再按一次将加载指向已删除项目A的片段,导致在尝试从DB加载现在已删除的数据时造成麻烦。
目前唯一的解决办法我已经是重新创建片段的缺失项时,检测onCreateView问题,并使用popBackStack()
清理从堆栈中的孩子碎片时,列表是有道理的,谢谢你的建议! 使用popBackStackImmediate()时,前面的片段闪烁了一些,所以我做了: 'for(int framesLeft = fm。getBackStackEntryCount(); framesLeft> 0; --framesLeft)fm.popBackStack();' 我离开这个打开,因为我仍然想知道如何处理历史记录中的项目可能会被删除的情况。 – Knotgrund 2014-11-26 20:40:22
你能解释一下你所关心的吗?你的意思是说你可能对某个细节片段有些事要做,而当用户进入列表时,你想要做那件事,而不是仅仅从后面的堆栈中弹出片段?如果这个猜测是正确的,你可以覆盖片段的onPause。 – Bruce 2014-11-26 23:07:42