多片段层次结构中的菜单膨胀问题
Menu inflating issue in Multiple fragment hierarchy
在不同片段中展开不同菜单时遇到问题。
我的应用程序层次结构如下:
BottomNavigationView --> Fragments(4) ---> Tab+ViewPager --> Fragments(3)
每个片段包含 ViewPager,ViewPager 包含多个片段。
为了更清楚,请查看所附图片。
问题: 一直在添加新的菜单,或者有时会保留之前的屏幕菜单。
我试过使用 "menu.clear()"、"getActivity().invalidateOptionsMenu();"
您有ViewPager
,这意味着如果您转到第i
个位置,也会创建位置i-1
和i+1
上的片段。所以他们的 onCreateOptionsMenu 将被调用,即使你调用 menu.clear() 它也不会正常工作。
解决方案是更改 ViewPager 容器 Fragment/Activity 中的菜单,方法如下。将 ViewPager.OnPageChangeListener 侦听器添加到 ViewPager 并在 onPageSelected(int position) 方法中自行更改菜单:
@Override
public void onCreateOptionsMenu(final Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
int menuResourceId = getMenuResourceByPosition(position);
menu.clear();
inflater.inflate(menuResourceId, menu);
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
}
创建方法 getMenuResourceByPosition
,它将根据 ViewPager
的选定位置为您提供正确的菜单资源 ID。
在不同片段中展开不同菜单时遇到问题。
我的应用程序层次结构如下: BottomNavigationView --> Fragments(4) ---> Tab+ViewPager --> Fragments(3)
每个片段包含 ViewPager,ViewPager 包含多个片段。
为了更清楚,请查看所附图片。
问题: 一直在添加新的菜单,或者有时会保留之前的屏幕菜单。
我试过使用 "menu.clear()"、"getActivity().invalidateOptionsMenu();"
您有ViewPager
,这意味着如果您转到第i
个位置,也会创建位置i-1
和i+1
上的片段。所以他们的 onCreateOptionsMenu 将被调用,即使你调用 menu.clear() 它也不会正常工作。
解决方案是更改 ViewPager 容器 Fragment/Activity 中的菜单,方法如下。将 ViewPager.OnPageChangeListener 侦听器添加到 ViewPager 并在 onPageSelected(int position) 方法中自行更改菜单:
@Override
public void onCreateOptionsMenu(final Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
int menuResourceId = getMenuResourceByPosition(position);
menu.clear();
inflater.inflate(menuResourceId, menu);
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
}
创建方法 getMenuResourceByPosition
,它将根据 ViewPager
的选定位置为您提供正确的菜单资源 ID。