为什么 onCreateOptionsMenu 运行 多次?

Why does onCreateOptionsMenu run multiple times?

出于某种原因,我的 onCreateOptionsMenuonPrepareOptionsMenu 运行 两次(在两种方法开始时通过日志输入进行了检查)。这发生在我拥有的多个片段上,包括一些非常基本的片段(只是膨胀菜单,没有别的)。

这是有此问题的 onCreateOptionsMenu 之一:

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

什么会导致这些方法被多次调用(大部分是两次)?


更新

我发现这是(在某种程度上)由我正在使用的 RecyclerView 引起的。所有有这个问题的视图都使用 RV,我之前提到的视图没有这个问题,确实没有。 有了这个新信息,RV 的哪一部分可能会造成这个问题?

更新2

我发现我在Adapter中的getItemCount()方法中调用了.invalidateOptionsMenu()。我 以为 这会调用 onPrepareOptionsMenu(),但阅读文档,它似乎调用 onCreateOptionsMenu()。我这里可能 onCreate..()onPrepare..() 颠倒了,现在就去看看。

更新3

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

@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;
        }
    }
}

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

现在如何阻止片段调用 activity 的 onCreateOptionsMenu 再次膨胀菜单布局 n 再次在片段内的 onCreate(重写方法)中声明它。

setHasOptionsMenu(false);

如果你想在 activity 处也有菜单,但片段有不同的菜单,那么

menu.clear(); 

而不是从片段的 onCreateOptionsMenu()

调用 super()

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

如您所说,启动器 activity 是一个片段,因此您想禁用此片段的菜单,因此请在此片段中执行以下操作:

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

希望我有所帮助。 !

这是我自己的错。我在 RecyclerViewAdaptergetItemCount() 方法中使选项菜单无效,它显然在片段启动时运行。您可以查看包含我的错误的代码的问题。感谢大家的help/suggestions。