【问题标题】:Duplicate Menu and Data in Fragments after using FragmentStatePagerAdapter使用 FragmentStatePagerAdapter 后片段中的重复菜单和数据
【发布时间】:2015-12-18 06:32:38
【问题描述】:

我在这里尝试了各种帖子提供的很多答案,但对我没有任何帮助。

问题- 我有一个导航抽屉,它有 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);
    }
    
  • 一切正常。但是当我访问导航抽屉中的其他片段时,它会在工具栏中显示重复的菜单。当我访问其他片段时,如果工具栏中有剩余空间,则会创建更多重复项。

Try 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);
}

有了这个,我得到了 Fragment 和 Activity 菜单,但是有重复项。

这应该很容易解决,但我没有找到解决方法。可能是我对生命周期的理解不够深入?

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

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

menu.clear();
inflater.inflate(R.menu.story, menu);
getActivity().getMenuInflater().inflate(R.menu.main, menu);

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

【问题讨论】:

  • 所以基本上你想要来自你的 activity_menu 文件的所有片段中的通用菜单项并从片段中休息,对吗?
  • 在其他片段中,如果您不想要菜单,请为它们调用setHasOptionsMenu(false);
  • @PiyushGupta 我想要每个片段的菜单。
  • @Roon13 那么你的最后一个选项是最好的选择.. 实现菜单项[片段相关] + 所有片段中的共同点..
  • @Roon13 我再次阅读了您的问题。所以,在更改您的第一个片段以实现 FragmentPagerAdapter 之前,您的片段曾经并且必须正确显示菜单项,对吧?

标签: android android-fragments fragmentstatepageradapter


【解决方案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()..

希望你正在寻找这个

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-14
    相关资源
    最近更新 更多