当前位置: 首页 > 知识库问答 >
问题:

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

张毅
2023-03-14

我有一个带有底部导航视图的活动,其中有3个相关片段。其中之一是带有ViewPager2的片段,ViewPager2使用FragmentStateAdapter。在适配器的createfragment(int position)方法中,我返回另一个片段的两个实例,该片段有一个选项菜单,在它的onCreate()中,我调用setHasOptionsMenu(true)。问题是,在适配器初始化时,所有片段的菜单都是可见的,而不仅仅是当前可见片段的菜单。第一次刷卡后,菜单似乎失效,一切都正常。如果我将添加另一个片段的更改通知适配器,那么问题也会出现,然后新添加的片段会出现另一个菜单项。我看到了一个类似的问题,但答案是在片段的onResume()方法中调用setHasOptionsMenu(),但这似乎不是处理这个问题的正确行为。在一条评论中,另一位用户建议将ViewPager2升级到另一个版本,但我使用的是最新版本。有人能告诉我怎么处理吗?

共有3个答案

辛龙野
2023-03-14

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

它可以在未设置off屏幕页面消除时工作。但是,它的性能很差。ViewPager没有问题。

上官斌
2023-03-14

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

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

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

请注意,现有的菜单是逐项删除的(R. id...),而膨胀的菜单则像往常一样由菜单(R. list...)添加。

在下面的示例中,搜索菜单将始终膨胀,而要膨胀的第二个菜单将取决于当前激活的片段。

    @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 ());
    }
}
东郭阳德
2023-03-14

我加入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)

 类似资料:
  • 我正在使用SimonVT的MenuDrawer库(https://github.com/SimonVT/android-menudrawer)并在代码中遵循了他的片段样本。一切都很好,但是在片段示例中,菜单出现在屏幕的整个左侧(从上到下),穿过/越过操作栏。我希望菜单抽屉在任何时候都出现在ActionBar的下方,这样ActionBar就可以保持在原位。我已经尝试了两个属性覆盖和后面,但都接管了整

  • 我在xml文件中有一个主容器,我将根据按钮点击替换其中的片段。 当活动打开时,我正在使用以下代码将碎片1添加到主容器 在HomeMainFragment中,单击一个按钮,执行以下操作。 在Fragment2中,单击另一个按钮,使用以下代码移动到Fragment3。 现在,当我单击后退时,我的UI应该显示HomeFragment,而不是显示home以及合并在一起的fragment3。 只是想明确我的

  • 我试图在片段中填充一个具有自定义布局的listView。但是,当我启动应用程序时,listview的内容没有加载(这是使用数组适配器获得的)。下面是加载listView的代码: 这里是我的CustomAdapter的代码: } 这是列表项布局的xml: 这里是主要布局: 我没有收到任何错误消息,但是当我启动应用程序时,listView中没有显示任何项目,并且永远不会调用我的适配器的getView方

  • 我有方法: 将图像添加到我的recyclerview。如果它在活动中,我会在OnCreate中调用initImageBitmaps()。不幸的是,我必须在片段中使用它,问题是:如何将这些方法实现到扩展片段的类?当然,所有内容都将显示在RecyclerView中,并带有xml中的recycler\u视图id。 编辑:我的适配器: 它仅在注释mContext=context时编译 在适配器中。那么错误

  • 我在中有一个可以膨胀的工具栏。我有一个名为的菜单,它会膨胀,只显示一个图标。 当用户单击打开片段时。我有另一个菜单,它有两个图标。 当我在片段中膨胀friends菜单时,它仍然显示菜单中的图标。 非常感谢您的任何建议,

  • 我有3个碎片。 每个片段都有自己的AsyncTask。 当我“启动”FragmentActivity时,将显示片段1,并执行其asynctask。但是它最近的片段(片段2,中间的片段)也启动它的AsyncTask。 我想知道是否只有当用户看到片段时才可以启动异步任务。我想如果是可能的,因为我想显示一个进度对话框(获取数据...)。现在我从数据库中得到的数据很少,但如果我有很多,我想显示一个进度对话