Android 如何处理引用已删除项目的backback
我正试图弄清楚如何正确处理通过可能指向已删除项目的片段回栈进行回导航的问题。我想这是一个非常常见的情况,但我还没有找到解决办法 |-----------------------|--------------------------------------------------|--------------------| | 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 | |-----------------------|--------------------------------------------------|--------------------| 我添加的大部分片段如下:Android 如何处理引用已删除项目的backback,android,android-fragments,back-stack,Android,Android Fragments,Back Stack,我正试图弄清楚如何正确处理通过可能指向已删除项目的片段回栈进行回导航的问题。我想这是一个非常常见的情况,但我还没有找到解决办法 |-----------------------|--------------------------------------------------|--------------------| | Action | Back stack | Lo
getSupportFragmentManager().beginTransaction()
.replace(R.id.container, TheFragment.newInstance(type))
.addToBackStack(null)
.commit();
编辑
在这种情况下,决不允许back向下导航层次结构可以避免问题,但我想解决的一般问题是:
假设项目具有“下一步”选项,并且在导航项目时还可以访问“管理项目”视图
从“管理项目”返回时,我希望跳回以前访问的项目
因此,我浏览A->B->管理项目
从“管理项目”中,我删除项目A,然后按back,弹出项目B的片段,这很好。再次按back将加载指向已删除项A的片段,在我尝试从DB加载现在已删除的数据时会造成问题
目前我唯一的解决方法是在为丢失的项目重新创建片段时检测onCreateView中的问题,并使用popBackStack()进行“转义”当您返回列表时是否确实需要维护后堆栈?我本以为在那一点上会清除后台堆栈,就像安卓主屏幕上的back键不会将您带到设备上运行的前一个应用程序一样
您可以通过清除列表片段的onResume中的后堆栈来实现这一点。如果列表始终是起点,则可以使用:
FragmentManager fm = getFragmentManager();
while (fm.popBackStackImmediate()) {
}
如果您有时需要在进入列表之前保留后堆栈,那么您可以使用其他类型的PopBackbackImmediate来指定要返回的ID或名称。在进入列表时清除堆栈中的子片段是有意义的,感谢您的建议!在使用popbackbackimmediate()时,前面的片段出现了一些闪烁,所以我这样做了:for(int framesLeft=fm.getbackbackentrycount();framesLeft>0;--framesLeft)fm.popbackbackstack()代码>我将此保留为打开状态,因为我仍然想知道如何处理历史记录中的某个项目可能被删除的情况。请您解释更多您关心的问题,好吗?你的意思是你可能要对其中一个细节片段做些什么,当用户进入列表时,你想做那件事,而不是仅仅把片段从后堆栈中弹出?如果这个猜测是正确的,您可以覆盖片段的onPause。
getSupportFragmentManager().beginTransaction()
.replace(R.id.container, TheFragment.newInstance(type))
.addToBackStack(null)
.commit();
FragmentManager fm = getFragmentManager();
while (fm.popBackStackImmediate()) {
}