8

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

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

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

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


更新

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

更新2

我发现我.invalidateOptionsMenu()getItemCount(). Adapter以为这会调用onPrepareOptionsMenu(),但阅读文档,它似乎调用了onCreateOptionsMenu(). 我可能在这里颠倒过来onCreate..()onPrepare..()现在要检查一下。

更新3

我刚刚意识到我RecyclerViewAdaptergetItemCount()方法中的选项菜单无效,该方法显然在第一次创建片段时运行。

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

2 回答 2

5

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

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

setHasOptionsMenu(false);

如果您也想在活动中有菜单,但片段的不同菜单,然后做

menu.clear(); 

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

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

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

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

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

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

希望我有所帮助。!

于 2016-08-08T20:18:05.997 回答
2

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

于 2016-08-10T12:29:19.807 回答