FragmentManager popBackStack不会删除片段

edr*_*ian 14 android android-fragments fragmentmanager android-nested-fragment

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

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

这一切都按预期工作.但是我遇到了这个问题:

  1. 在onResume()上加载一个调用setHasOptionsMenu(true)的部分
  2. 加载另一个部分(旧部分,它是为了摆脱堆栈).我觉得没问题.没有菜单显示
  3. 离开应用程序(例如,转到Android Laucher活动)然后当我返回时,我看到正确的部分,但它显示了旧片段的菜单.

我已经迭代了backstack并打印了每个片段,并且它不是菜单中的片段.

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

我想知道我做错了什么,我怎么能解决它,谢谢

更新:

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

fm.beginTransaction()
    .add(container, sectionFragment.getFragment())
    .addToBackStack(sectionFragment.getFragmentName())
    .commit();
Run Code Online (Sandbox Code Playgroud)

并删除:

private void clearStack(){
int count = fm.getBackStackEntryCount();
    while(count > 1){
        fm.popBackStack();
        count--;
    }
}
Run Code Online (Sandbox Code Playgroud)

注1:我正在使用add而不是替换,因为当我从详细信息部分导航回来时,我不想丢失我的片段的状态.当我加载另一个不同的部分,然后我调用clearStack将堆栈弹出到1,然后加载新的片段.最后,我调用executePendingTransactions()来完成从事务中删除片段.

注2:我看到它正在我的片段onDestroy()方法上进入,所以它被摧毁了.但我不知道为什么在Main活动恢复时会再次调用它.

edr*_*ian 22

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

问题是一些片段在其中加载了另一个片段(它有ViewPager组件).然后我想,当片段被移除后,这些片段也被移除了.

仅在使用getChildFragmentManager()方法时才是这样.在其他碎片中加载碎片时必须使用此方法.如果不是,则将片段与片段活性相关联.


Mal*_*der 6

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

fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
Run Code Online (Sandbox Code Playgroud)

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


Nei*_*ige 5

popBackStack只会恢复您的最后一个FragmentTransaction

如果您使用FragmentTransaction.addpopBackStack只会致电FragmentTransacetion.remove

但是,如果您致电FragmentTransaction.replacepopBackStack将会致电FragmentTransaction.removeFragmentTransaction.add

对于您的“ NOTE 1”: FragmentTransaction.replace将不会更改片段状态。