多片段层次结构中的菜单膨胀问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多片段层次结构中的菜单膨胀问题相关的知识,希望对你有一定的参考价值。

enter image description here

在不同片段中膨胀不同菜单时面临问题。

我的应用程序层次结构如下:BottomNavigationView - > Fragments(4)---> Tab + ViewPager - > Fragments(3)

每个片段包含ViewPager,ViewPager包含多个片段。

请参阅附图以获得更清晰的信息。

问题:它一直在添加新菜单,或者有时会带有前一个屏幕菜单。

我尝试过使用“menu.clear()”,“getActivity()。invalidateOptionsMenu();”

答案

你有ViewPager,这意味着如果你去ith位置,也会创建位于i-1i+1位置的碎片。所以他们的onCreateOptionsMenu将被调用,即使你调用menu.clear()它也无法正常工作。

解决方案是以下列方式更改容器Fragment / Activity of ViewPager中的菜单。将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。

以上是关于多片段层次结构中的菜单膨胀问题的主要内容,如果未能解决你的问题,请参考以下文章

Android:在drawerlayout中使用地图膨胀片段时出错

如何在片段中使用与活动中不同的菜单?

片段对话框中的片段膨胀引发错误“片段未创建视图”

在 Android Navigation 组件中使用 backstack 打开不同层次结构中的片段

Android 片段 onCreateView 与 onActivityCreated

iOS Swift 中的 Android 片段模拟