【问题标题】:Fragment displays wrong menu items片段显示错误的菜单项
【发布时间】:2026-01-06 01:45:01
【问题描述】:

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

我有一个带有自定义后退堆栈的活动,以使用以下方法维持正确的流程:

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

这样每个“标签”都有自己的后台堆栈。 我在片段之间切换:

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

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

如何克服这种不良行为?

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

【问题讨论】:

  • 你在 ViewPager 中使用 Fragment 吗?
  • @rupinderjeet 不,我使用的是底部导航视图

标签: android android-fragments menu menuitem


【解决方案1】:

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

【讨论】:

  • 它被调用,并且为每个片段膨胀了正确的菜单。然而,片段仍​​然显示错误的项目。调试错误的菜单项时,即使在点击 onCreateOptionsMenu 之前也可见
【解决方案2】:

我最终发现了问题。 片段的 onCreateView 看起来是这样的:

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

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

【讨论】: