FragmentManager popBackStack不会删除片段

我正在使用Fragments实现菜单导航。 所以我从Home开始,然后用户可以导航到每个部分的不同部分和细节。

当用户更改部分时,我在fragmentmanager的backstack上调用pop,直到到达Home,然后加载新的部分。

这一切都按预期工作。 但是我得到这个问题:

  1. 加载一个调用onResume()的setHasOptionsMenu(true)
  2. 加载另一个部分(老的部分,它被放置在堆栈之外)。 我明白了。 没有菜单显示
  3. 离开应用程序(例如,去Android Laucher活动),然后当我回来时,我看到正确的部分,但它显示旧的片段的菜单。

我已经迭代了后台并打印每个片段,而不是菜单的片段。

我在onResume()方法( setHasOptionsMenu(true)被标记的地方)上放了一个debugging标记,它确实进入了这里,所以碎片仍然在某处。

我想知道如果我做错了什么,我怎么能解决它,thx

更新:

我正在使用此代码来加载新的片段

 fm.beginTransaction() .add(container, sectionFragment.getFragment()) .addToBackStack(sectionFragment.getFragmentName()) .commit(); 

而为了删除:

 private void clearStack(){ int count = fm.getBackStackEntryCount(); while(count > 1){ fm.popBackStack(); count--; } } 

注1:我使用添加替代,因为我不想松散我的片段状态,当我从细节部分导航回来。 当我加载另一个不同的部分,然后我调用clearStackpopup堆栈高达1,然后加载新的片段。 最后,我调用executePendingTransactions()完成从事务中删除碎片。

注2:我看到它正在我的片段onDestroy()方法进入,所以它被认为是被销毁。 但是我不知道为什么在主要活动恢复时再次调用它。

Solutions Collecting From Web of "FragmentManager popBackStack不会删除片段"

我发现问题不在于添加和删除堆栈片段的逻辑。

问题是一些片段里面加载了另一个片段(它有ViewPager组件)。 然后我想,当片段被删除,然后这些片段也被删除。

只有在使用getChildFragmentManager()方法时才是如此。 在其他片段内加载片段时,必须使用这个方法。 如果不是这样,则片段与片段活性分离。

我发现这个问题,因为在打电话之后

 fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 

这段代码fragmentManager.getFragments().size()返回堆栈中我的最大片段数。 我检查了null上的每一个片段。 我发现在我的情况下,一些片段是空的。 也许这对别人有帮助)

popBackStack将只是恢复您的最后一个FragmentTransaction

如果你使用FragmentTransaction.addpopBackStack将会调用FragmentTransacetion.remove

但是如果你调用FragmentTransaction.replacepopBackStack会调用FragmentTransaction.removeFragmentTransaction.add

对于你的“注1”: FragmentTransaction.replace不会改变你的片段状态。

如果你真的想一次删除碎片然后按照: 如何replace不同types的碎片?

否则,使用replace事务碎片来平滑过渡和无自由的方法,请参阅https://stackoverflow.com/a/23013075/3176433

也理解片段生命周期, http://developer.android.com/guide/components/fragments.html