为什么onCreateOptionsMenu会多次运行?

时间:2016-08-08 19:54:16

标签: java android android-optionsmenu oncreateoptionsmenu

出于某种原因,我的onCreateOptionsMenuonPrepareOptionsMenu运行了两次(在两种方法的开头都检查了日志输入)。这种情况发生在我拥有的多个片段中,包括一些非常基本的片段(只是给菜单充气,没有别的)。

这是出现此问题的onCreateOptionsMenu之一:

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.actionbuttons_add_removeall, menu);
    optionsMenu = menu;
}

什么可能导致多次调用这些方法(大多数是两次)?

更新

我发现这是由RecyclerView我正在使用的(以某种方式)引起的。所有有这个问题的观点都使用了RV,我之前提到过的观点没有这个问题,实际上并没有。 有了这个新信息,RV的哪一部分可能会出现这个问题?

UPDATE2

我发现我在.invalidateOptionsMenu()中的getItemCount()方法中调用Adapter。我认为这会调用onPrepareOptionsMenu(),但是阅读文档后,它似乎会调用onCreateOptionsMenu()。我可能会在此onCreate..()onPrepare..()被撤消,现在就检查一下。

UPDATE3

我刚刚意识到我使用RecyclerViewAdapter方法中的选项菜单无效,getItemCount()方法显然在首次创建片段时运行。

@Override
public int getItemCount() {
    int tableSize = getTableSizeMethod();

    if (tableSize < 1) {
        if (!AppManagerFragment.hideDeleteAllButton) {
            AppManagerFragment.hideDeleteAllButton = true;
            ((Activity) context).invalidateOptionsMenu();
            return 0;
        }
    } else {
        if (!AppManagerFragment.hideDeleteAllButton) {
            AppManagerFragment.hideDeleteAllButton = false;
            ((Activity) context).invalidateOptionsMenu();
            return tableSize;
        }
    }
}

2 个答案:

答案 0 :(得分:2)

这是我自己的错。我使getItemCount()的{​​{1}}方法中的选项菜单无效,这显然在启动片段时运行。您可以查看包含我的错误的代码的问题。感谢所有的帮助/建议。

答案 1 :(得分:1)

只要片段首先创建或变为可见,就会调用这些方法和onResume,因为onCreate甚至在onCreateView之前被调用,其中所有非ui事物都被初始化并且调用了Activity。希望很清楚为什么这两个人多次调用父活动的super()。

现在该做些什么来阻止片段从调用活动的onCreateOptionsMenu再次再次膨胀菜单布局n,在片段里面的onCreate(重写方法)中声明这个。

setHasOptionsMenu(false);

如果你想在活动中有菜单,但是片段有不同的菜单,那么

menu.clear(); 

而不是从片段super()

中调用onCreateOptionsMenu()

如果您只想在Mainactivity中停用菜单,请尝试return false或从MainActivity中删除onCreateOptionsMenu()

正如你所说,启动器活动是一个片段,所以你想要禁用这个片段的菜单,所以在这个片段中做这样的事情:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}

然后从同一片段内的onCreateOptionsMenu()禁用并隐藏那些menuItem。

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

即使这没有帮助,也请尝试查找单独的菜单项并禁用它们并将其可见性设置为false。

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    if (menu != null) {
       menu.findItem(R.id.action_abc).setVisible(false);
       menu.findItem(R.id.action_xyz).setVisible(false);
    }
}

希望我帮助过。 !