为什么 onCreateOptionsMenu 运行 多次?
Why does onCreateOptionsMenu run multiple times?
出于某种原因,我的 onCreateOptionsMenu
和 onPrepareOptionsMenu
运行 两次(在两种方法开始时通过日志输入进行了检查)。这发生在我拥有的多个片段上,包括一些非常基本的片段(只是膨胀菜单,没有别的)。
这是有此问题的 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);
}
}
希望我有所帮助。 !
这是我自己的错。我在 RecyclerViewAdapter
的 getItemCount()
方法中使选项菜单无效,它显然在片段启动时运行。您可以查看包含我的错误的代码的问题。感谢大家的help/suggestions。
出于某种原因,我的 onCreateOptionsMenu
和 onPrepareOptionsMenu
运行 两次(在两种方法开始时通过日志输入进行了检查)。这发生在我拥有的多个片段上,包括一些非常基本的片段(只是膨胀菜单,没有别的)。
这是有此问题的 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);
}
}
希望我有所帮助。 !
这是我自己的错。我在 RecyclerViewAdapter
的 getItemCount()
方法中使选项菜单无效,它显然在片段启动时运行。您可以查看包含我的错误的代码的问题。感谢大家的help/suggestions。