onPrepareOptionsMenu在ActionBar中复制项目

时间:2012-02-29 00:10:25

标签: android android-fragments menuitem android-actionbar

当我使用onPrepareOptionsMenu添加菜单项时,菜单项会在操作栏中复制其自身。我正在使用片段并在主要活动的ActionBar中创建初始菜单,如下所示:

...
 @Override
    public boolean onCreateOptionsMenu(Menu paramMenu) {
    super.onCreateOptionsMenu(paramMenu);
    paramMenu.add(0, 1, 0, "DashBoard").setIcon(R.drawable.ic_dashboard)
        .setShowAsAction(1);
    return true;
    }

然后我在其中一个片段中添加另一个项目如下:

...
@Override
    public void onPrepareOptionsMenu(Menu paramMenu) {
    paramMenu.add(0, 2, 1, "FullScreen").setIcon(R.drawable.ic_fullscreen)
        .setShowAsAction(1);
    }

由于某种原因,这个通过片段类添加的项目显示两次....我有什么不对吗?

对我的错误的任何帮助将不胜感激

3 个答案:

答案 0 :(得分:13)

每次显示菜单前都会调用

onPrepareOptionsMenu

menu.clear()()中使用onPrepareOptionsMenu,然后添加新的菜单项。

答案 1 :(得分:4)

该项目可能会显示两次,因为您要添加两次。请参阅docs for onPrepareOptionsMenu

  

在每次显示菜单之前调用此方法。

我真的不会盲目地在onPrepareOptionsMenu中添加一个项目。你应该检查它是否已经被添加。

答案 2 :(得分:-1)

我在活动中使用片段,并使用滑动在它们之间切换。我的主要活动有一些菜单项,但我使用我的片段在运行时动态添加一个,即当片段变得可见时。我的碎片的oncreateOptions方法如下所示:菜单项现在只出现一次

  @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
        //menu.clear();
        if(menu.size() == 1) {
            // inflater.inflate(R.menu.dashboard_main,menu);
            MenuItem mit = menu.add("Refresh");
            mit.setIcon(android.R.drawable.stat_notify_sync);
            mit.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
        }
    }

另一个可能的解决方案是,只有当instancestate bundle为null时才可以向活动添加片段,因为到那时,您的活动将丢弃片段,因此,必须使用其菜单项重新创建片段