出于某种原因,我的onCreateOptionsMenu
和onPrepareOptionsMenu
运行了两次(在两种方法的开头都检查了日志输入)。这种情况发生在我拥有的多个片段中,包括一些非常基本的片段(只是给菜单充气,没有别的)。
这是出现此问题的onCreateOptionsMenu
之一:
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.actionbuttons_add_removeall, menu);
optionsMenu = menu;
}
什么可能导致多次调用这些方法(大多数是两次)?
我发现这是由RecyclerView
我正在使用的(以某种方式)引起的。所有有这个问题的观点都使用了RV,我之前提到过的观点没有这个问题,实际上并没有。
有了这个新信息,RV的哪一部分可能会出现这个问题?
我发现我在.invalidateOptionsMenu()
中的getItemCount()
方法中调用Adapter
。我认为这会调用onPrepareOptionsMenu()
,但是阅读文档后,它似乎会调用onCreateOptionsMenu()
。我可能会在此onCreate..()
和onPrepare..()
被撤消,现在就检查一下。
我刚刚意识到我使用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;
}
}
}
答案 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);
}
}
希望我帮助过。 !