我正在使用Fragments实现菜单导航。所以我从主页开始,然后用户可以导航到不同的部分和每个部分的详细信息。
当用户更改部分时,我会在fragmentmanager回退栈上调用pop直到达到主页,然后加载新的部分。
这一切都按预期工作。但我遇到了这个问题:
- 加载调用onResume()方法的部分并在其中调用setHasOptionsMenu(true)
- 再加载另一个部分(旧部分应该已经从栈中退出)。我看到它没问题。没有菜单显示
- 离开应用程序(例如,转到Android Laucher活动),然后当我返回时,我看到正确的部分,但它显示旧Fragment的菜单。
我已经迭代了回退栈并打印了每个片段,那里没有带有菜单的片段。
我在onResume()方法(标记了setHasOptionsMenu(true)的位置)上放了一个调试标记,它确实进入了这里,因此Fragment仍然在某个地方。
我想知道我是否做错了什么,以及如何解决它,谢谢
更新:
我正在使用以下代码加载新的Fragments:
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:我发现它正在进入我的fragment onDestroy()方法,所以它应该已经被销毁了。但是我不知道为什么当主Activity恢复时,它又被调用了一次。