片段显示错误的菜单项

Fragment displays wrong menu items

出于未知原因,有时我的片段显示属于不同片段的菜单项。

我有一个 activity 带有自定义返回堆栈以使用以下方法维护正确的流程:

 Map<Integer, List<Fragment>> fragmentStack = new HashMap<>();

这样每个 "tab" 都有自己的后台。 我在片段之间切换:

 getSupportFragmentManager().beginTransaction()
    .replace(R.id.container, fragment)
    .commitNow();

片段在地图中维护,因此当切换到现有片段时,我使用它已经初始化的视图。
有时,当我从一个片段切换到第二个片段时,第二个片段会显示堆栈中先前创建的片段的菜单项,尽管 onCreateOptionsMenu 在第二个片段。

我该如何克服这种不良行为?

导致此行为的行为:
1. 从第一个选项卡开始。映射在键 0 处初始化,List<fragment> 有一个片段,称为 A。然后显示该片段。 (片段 A 有菜单项)
2. 导航到第二个选项卡。映射在键 1 处初始化,List<fragment> 有一个片段,称为 B,此片段显示(替换片段 A)。片段 B 也有菜单项。
3. 导航回到第一个选项卡。使用以前的片段 A,包括它已经初始化的视图(不膨胀新视图)。
4. 单击带有导航到位于同一选项卡的新片段 C 的内容。片段 C 被添加到片段列表中,在 Map 的键 0 下。片段 C 没有菜单项。
5. 导航到第二个选项卡。显示了上一个片段 B,但带有片段 A 的菜单项!

检查是否为所有片段调用 onCreateOptionsMenu。

我终于找到问题了。 片段的 onCreateView 看起来是这样的:

if (rootView == null) {
// Init view logic and inflation, and:
((AppCompatActivity) getActivity()).setSupportActionBar(toolbar);
}
return rootView;

((AppCompatActivity) getActivity()).setSupportActionBar(toolbar); 移到 if 语句之外解决了问题。