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

时间:2020-06-02 13:57:25

标签: android android-fragments android-viewpager2

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

2 个答案:

答案 0 :(得分:4)

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

修复程序是将ViewPager2的最新alpha01版本更新。

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

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

修复了将片段添加到FragmentManager时具有初始片段菜单可见性的FragmentStateAdapter问题。 (I9d2ff,b / 144442240)

答案 1 :(得分:1)

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

我看到了类似问题的答案,他们说要先清除整个菜单。那也应该工作,但是我有一些菜单项在“活动”中加载,这些菜单项不重复,而有些在片段中加载,这些菜单项确实重复。我想在活动中将其夸大,只从所有片段中删除所有片段(以防万一,不只是当前片段)。

因此,我的解决方法是每次仅删除所有片段中添加的项目,并在删除每个片段之前检查以确保每个片段实际上都在其中(不是null)。然后,一旦删除了这些,我将为所有/每个片段添加所需的菜单。

请注意,现有菜单是逐项(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 ());
    }
}