为什么 onCreateOptionsMenu 运行多次?

Tim*_*j93 7 java android android-optionsmenu oncreateoptionsmenu

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

这是onCreateOptionsMenu有此问题的s之一:

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

什么会导致这些方法被多次调用(主要是两次)?


更新

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

更新2

我发现我打电话.invalidateOptionsMenu()getItemCount()的方法Adapter。我认为这会调用onPrepareOptionsMenu(),但阅读文档,它似乎调用onCreateOptionsMenu(). 我可能得到onCreate..()onPrepare..()逆转这里,要去检查出来了。

更新3

我刚刚意识到我的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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Muh*_*der 6

每当片段首次创建或变得可见以及 onResume 时,都会调用这些方法,因为 onCreate 甚至在 onCreateView 之前调用,其中所有非 ui 事物都得到初始化并调用 Activity。希望清楚为什么这两个人多次调用父活动的 super() 。

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

setHasOptionsMenu(false);
Run Code Online (Sandbox Code Playgroud)

如果您想在活动中也有菜单,但片段有不同的菜单,那么可以这样做

menu.clear(); 
Run Code Online (Sandbox Code Playgroud)

而不是super()从片段调用onCreateOptionsMenu()

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

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

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}
Run Code Online (Sandbox Code Playgroud)

然后从onCreateOptionsMenu()同一片段内部禁用并隐藏这些菜单项。

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
menu.clear();
}
Run Code Online (Sandbox Code Playgroud)

即使这没有帮助,也请尝试查找单独的菜单项并禁用它们并将其可见性设置为 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

希望我有所帮助。!


Tim*_*j93 2

这件事是我自己的错。getItemCount()我使my 的方法中的选项菜单无效RecyclerViewAdapter,该方法显然在片段启动时运行。您可以查看包含我的错误的代码的问题。感谢大家的帮助/建议。