答案 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 ());
}
}