我正在使用 Fragments 实现菜单导航。所以我从主页开始,然后用户可以导航到不同的部分和每个部分的详细信息。
当用户更改部分时,我在 fragmentmanager backstack 上调用 pop 直到我到达 Home,然后加载新部分。
这一切都按预期工作。但我遇到了这个问题:
- 在 onResume() 上加载调用 setHasOptionsMenu(true) 的部分
- 加载另一个部分(它应该从堆栈中取出的旧部分)。我看还行。没有显示菜单
- 离开应用程序(例如,转到 Android Laucher 活动),然后当我返回时,我看到了正确的部分,但它显示的是旧片段的菜单。
我已经迭代了 backstack 并打印了每个片段,它不是带有菜单的片段。
我在 onResume() 方法(标记的地方)上放了一个调试标记setHasOptionsMenu(true)
,它确实进入了这里,所以 Fragment 它仍然在某个地方。
我想知道我是否做错了什么以及如何解决它,谢谢
更新:
我正在使用此代码加载新片段
fm.beginTransaction()
.add(container, sectionFragment.getFragment())
.addToBackStack(sectionFragment.getFragmentName())
.commit();
并删除:
private void clearStack(){
int count = fm.getBackStackEntryCount();
while(count > 1){
fm.popBackStack();
count--;
}
}
注意 1:我使用 add 而不是 replace 因为我不想在从详细信息部分返回时丢失片段的状态。当我加载另一个不同的部分时,我调用 clearStack 将堆栈弹出到 1,然后加载新片段。最后,我调用 executePendingTransactions() 来完成从事务中删除片段。
注意 2:我看到它正在进入我的片段 onDestroy() 方法,因此它应该被销毁。但我不知道为什么在 Main 活动恢复时它会再次被调用。