片段显示错误的菜单项
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 语句之外解决了问题。
出于未知原因,有时我的片段显示属于不同片段的菜单项。
我有一个 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 语句之外解决了问题。