Viewpager与不同菜单和公共工具栏不起作用。
Viewpager与不同菜单和公共工具栏不起作用。
我的应用程序中有选项卡。每个选项卡都有不同的片段和不同的菜单。下面是我使用的布局:
现在在每个片段的`onCreate()`方法中,我都已经设置了`setHasOptionsMenu(true);`。此外,我重写了每个片段的`onCreateOptionsMenu()`方法,其中包含了`menu.clear();`作为第一步,然后调用其父构造函数,最后加载片段自己的菜单xml。但是我得到的结果是这样的:
- 假设有5个选项卡。第2个和第3个选项卡都有一个包含两个更多片段的viewpager。
- 第1个选项卡没有菜单。
- 第2个选项卡有menu_2(仅适用于第2个子片段)。
- 第3个选项卡再次没有菜单。
- 第4个选项卡有menu_4(仅适用于第1个子片段)。
- 第5个选项卡有menu_5。
- 最初,选项卡1应该没有菜单,这是正常的。然后直接切换到选项卡3时,它显示menu_4,而默认情况下应该没有菜单。然后滑动到选项卡4,它会显示正确的menu_4,然后滑动回选项卡3时,它将不显示菜单(这是所需的)。
- 对于选项卡5也是同样的情况。如果我切换到第2个选项卡中的第2个子片段,那么与第1个选项卡观察到相同的行为。
简而言之,根据我的观察,它显示了相邻选项卡的菜单,这实际上是在当前片段之后执行的,因此会出现这种行为。
那么如何避免这种情况呢?
问题的原因是在Viewpager嵌套Viewpager的情况下,invalidateOptionsMenu方法无法正常工作。解决方法是设置所有屏幕外的fragment和subfragment的setHasOptionsMenu为false,并在ViewPager切换页面时调用invalidateOptionsMenu方法。
具体的解决方法如下:
1. 在Activity的XML布局文件中添加TabLayout和ViewPager。
2. 在Activity的Java类中,设置ViewPager的适配器和页面切换监听器。
3. 在页面切换监听器的onPageSelected方法中,调用invalidateOptionsMenu方法,参数为当前页面的位置。
4. 在invalidateOptionsMenu方法中,遍历所有的fragment和subfragment,将它们的setHasOptionsMenu设置为当前页面是否为其对应的位置。
5. 调用invalidateOptionsMenu方法。
这样可以解决在Viewpager嵌套Viewpager的情况下,不同菜单和共同工具栏无法正常工作的问题。如果有多个Viewpager嵌套的情况,可以将菜单设置为可见或不可见来实现不同的功能需求。