使用FragmentStatePagerAdapter

时间:2015-12-18 06:32:39

标签: android android-fragments fragmentstatepageradapter

我在这里尝试了很多不同帖子提供的答案,但对我来说没什么用。

问题 - 我的导航抽屉有6个片段但只有一个活动。一切都很好,直到我改变了抽屉里的第一个片段。我想在第一个片段中滑动选项卡。所以我使用了FragmentStatePagerAdapter

  • 每个片段都有自己的菜单以及MainActivity菜单。

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        // Notify the system to allow an options menu for this fragment.
        setHasOptionsMenu(true);
    }
    

    像这样膨胀:

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.story, menu);
    }
    
  • 一切正常。但是当我访问导航抽屉中的其他片段时,它会在工具栏中显示重复的菜单。如果我访问其他片段时工具栏中还有空间,则会创建更多重复项。

尝试1 :为了解决这个问题,我最初使用了:

@Override
public void onPrepareOptionsMenu(Menu menu) {
    menu.clear();
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
    inflater.inflate(R.menu.story, menu);
}

有了这个,我不会得到重复的菜单,但现在我没有看到MainActivity menus

尝试2

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    getActivity().invalidateOptionsMenu();
    inflater.inflate(R.menu.story, menu);
}

有了这个,我得到了片段和活动菜单,但是有重复项。

这应该很容易解决,但我没有找到解决这个问题的方法。也许我对生命周期并不了解?

我的另一种方法 - 在Fragments中实现所有菜单都可以实现,但这应该是我们的最后一个选择。

解决方案 - 为了维护这两个菜单,我所要做的就是这个(非常简单的解决方案):

menu.clear();
inflater.inflate(R.menu.story, menu);
getActivity().getMenuInflater().inflate(R.menu.main, menu);
来自第一个片段的

问题2 OnOptionsItemSelected方法在其他片段中被调用。

1 个答案:

答案 0 :(得分:1)

  private void hideAllMenuItems() {
        if (actionBarMenu != null) {
            actionBarMenu.findItem(R.id.action_item1).setVisible(false);
            actionBarMenu.findItem(R.id.action_item2).setVisible(false);
        }
    }


    private void showMenuIcon() {
        if (actionBarMenu != null) {
            hideAllMenuItems();
            if (currentFragment instanceof Fragment1)
                actionBarMenu.findItem(R.id.action_item1).setVisible(true);

            else if (currentFragment instanceof Fragment2)
                actionBarMenu.findItem(R.id.action_item2).setVisible(true);

        }
    }

每次新片段加载时调用shoeMenuIcon()..

希望你正在寻找这个

相关问题