2014-11-25 26 views
0

我想弄清楚如何正确处理导航通过可能指向已删除项目的片段回栈。我想这是一个很常见的情况,但我还没有找到解决方案。如何处理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()

回答

0

“逃离”你真的需要维护时后退堆栈你回到你的名单?我希望在那个时候清除后备栈,类似于Android主屏幕上的后退键不会将您带到设备上运行的前一个应用程序。

您可以通过清除列表片段的onResume中的后退堆栈来实现此目的。如果列表始终是出发点,你可以用:

FragmentManager fm = getFragmentManager(); 
while (fm.popBackStackImmediate()) { 
} 

如果有时需要保留后退堆栈你到列表之前,那么你可以使用其他品种popBackStackImmediate的指定的一个要返回的ID或名称。

+0

清理从堆栈中的孩子碎片时,列表是有道理的,谢谢你的建议! 使用popBackStackImmediate()时,前面的片段闪烁了一些,所以我做了: 'for(int framesLeft = fm。getBackStackEntryCount(); framesLeft> 0; --framesLeft)fm.popBackStack();' 我离开这个打开,因为我仍然想知道如何处理历史记录中的项目可能会被删除的情况。 – Knotgrund 2014-11-26 20:40:22

+0

你能解释一下你所关心的吗?你的意思是说你可能对某个细节片段有些事要做,而当用户进入列表时,你想要做那件事,而不是仅仅从后面的堆栈中弹出片段?如果这个猜测是正确的,你可以覆盖片段的onPause。 – Bruce 2014-11-26 23:07:42