我试图弄清楚如何正确处理导航回可能指向已删除项目的片段返回堆栈。我猜这是一个非常常见的情况,但我还没有找到解决方案。
|-----------------------|--------------------------------------------------|--------------------| | 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();
修改
永远不允许返回向下导航以避免在这种特殊情况下的问题,但我想解决的一般问题是:
说项目有一个' next'选项以及还有一个'管理项目'导航项目时可以访问的视图。
从'管理商品'返回我希望能跳回到之前访问过的项目。
所以我导航A -> B -> Manage Items
。
来自'管理商品'我删除项目A然后按回来,弹出到项目B的片段,这很好。再次按下将加载指向已删除项目A的片段,当我尝试从DB加载现在删除的数据时会出现问题。
我目前唯一的解决方法是在为缺少的项目重新创建片段时检测onCreateView中的问题,并且' escape'使用popBackStack()
答案 0 :(得分:0)
返回列表时,你真的需要维护后台吗?我原本期望在那时清除后台堆栈,类似于Android主屏幕上的后退键不会将您带到设备上运行的先前应用程序。
您可以通过清除列表片段的onResume中的后台堆栈来完成此操作。如果列表始终是起点,您可以使用:
FragmentManager fm = getFragmentManager();
while (fm.popBackStackImmediate()) {
}
如果您有时需要在到达列表之前保留后台堆栈,那么您可以使用其他一种popBackStackImmediate来指定要返回的ID或名称。