Android ViewPager2 FragmentStateAdapter 显示每个片段的菜单

Android ViewPager2 FragmentStateAdapter shows Menu from every Fragment

我有一个 activity 底部导航视图与 3 个关联的片段。 其中之一是带有使用 FragmentStateAdapter 的 ViewPager2 的片段。 在适配器的 createfragment(int position) 方法中,我 return 另一个具有选项菜单的片段的几个实例,在它的 onCreate() 中,我调用 setHasOptionsMenu(true)。 问题是在适配器初始化时,所有片段的菜单都可见,而不仅仅是当前可见片段的菜单。 第一次滑动后,菜单似乎无效,一切都应该如此。 如果我通知适配器有关添加另一个片段的更改,也会出现此问题,然后会为新添加的片段显示另一个菜单项。 我看到了一个类似的问题,但答案是在片段的 onResume() 方法内调用 setHasOptionsMenu() ,但这似乎不是处理此问题的正确行为。在评论中,另一位用户建议将 ViewPager2 升级到另一个版本,但我使用的是最新版本。 谁能告诉我如何处理这个问题?

我加入 Whosebug 只是为了回答这个问题,因为我也在这个问题上浪费了时间。

修复是更新到最新的 alpha01 版本的 ViewPager2。

implementation "androidx.viewpager2:viewpager2:1.1.0-alpha01"

参见:https://developer.android.com/jetpack/androidx/releases/viewpager2#1.1.0-alpha01

Fixed FragmentStateAdapter issue with initial fragment menu visibility when adding a fragment to the FragmentManager. (I9d2ff, b/144442240)

我尝试按照当前接受的答案中的建议更新到最新的 viewpager2 alpha,但没有帮助。

我看过类似问题的答案,他们说先清除整个菜单。这也应该有效,但我有一些菜单项加载到 Activity 中,它们不重复,还有一些加载到片段中,它们重复。我想让那些在 Activity 中膨胀并只从所有片段中删除所有片段(不只是当前片段,以防万一)。

因此,我的解决方法是每次只删除所有片段中添加的项目,在删除每个片段之前检查以确保每个项目确实存在(不为空)。然后,一旦删除了这些,我就会膨胀 all/each 片段所需的菜单。

请注意,现有菜单是逐项删除的 (R.id...),而膨胀的菜单是按菜单 (R.menu...) 照常添加的。

在下面的示例中,搜索菜单将始终展开,而要展开的第二个菜单将取决于它当前处于活动状态的片段。

    @Override public void onCreateOptionsMenu (@NonNull Menu menu, @NonNull MenuInflater
        inflater)
{
    super.onCreateOptionsMenu (menu, inflater);

    removeMenuItemIfPresent (menu, R.id.menu_search);
    removeMenuItemIfPresent (menu, R.id.menu_sample_filter1);
    removeMenuItemIfPresent (menu, R.id.menu_sample_filter2);

    inflater.inflate (R.menu.menu_search_menu, menu);
    inflater.inflate (mCurrentSection == 0 ? R.menu.menu_frag0 : R.menu.menu_frag1, menu);
}

private void removeMenuItemIfPresent (@NonNull Menu menu, int resourceIDToRemove)
{
        MenuItem menuItemToRemove = menu.findItem (resourceIDToRemove);

        if (menuItemToRemove != null) {
            menu.removeItem (menuItemToRemove.getItemId ());
    }
}

我不确定它以前是否有效,但现在我遇到了 ViewPager2 问题。当我添加片段时,每个片段都有不同的菜单项,菜单项不会反映在添加的第一个片段上。

未设置offscreenpagelimit时有效。但是,它的性能很差。 ViewPager 没有问题。