Tim*_*j93 7 java android android-optionsmenu oncreateoptionsmenu
出于某种原因, myonCreateOptionsMenu和onPrepareOptionsMenu运行两次(在两种方法开始时使用日志输入进行检查)。这发生在我拥有的多个片段中,包括一些非常基本的片段(只是膨胀菜单,没有别的)。
这是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 的哪一部分可能会引起这个问题?
我发现我打电话.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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
每当片段首次创建或变得可见以及 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)
希望我有所帮助。!
这件事是我自己的错。getItemCount()我使my 的方法中的选项菜单无效RecyclerViewAdapter,该方法显然在片段启动时运行。您可以查看包含我的错误的代码的问题。感谢大家的帮助/建议。
| 归档时间: |
|
| 查看次数: |
3635 次 |
| 最近记录: |