Android 什么';当想要更改创建的菜单时,调用InvalidateOptions菜单有什么好处?

Android 什么';当想要更改创建的菜单时,调用InvalidateOptions菜单有什么好处?,android,menu,android-actionbar,Android,Menu,Android Actionbar,大多数情况下,每当有人谈论更新ActionBar选项(如显示/隐藏项目)时,我都会看到人们通过调用InvalidateOptions菜单方法(或AppCompat等效方法)来再次强制执行OnCreateOptions菜单,这与之前的操作基本相同,即再次膨胀菜单,设置所有的菜单项等。所有这些工作,只是为了改变的可见性说。。。一项 我在谷歌看到的所有样本中都看到了同样的东西。就我的一生而言,我无法理解为什么所有这些不合理的开销都会发生(膨胀菜单等),而如果您只在本地保持菜单引用,并调用自定义方法,比

大多数情况下,每当有人谈论更新ActionBar选项(如显示/隐藏项目)时,我都会看到人们通过调用InvalidateOptions菜单方法(或AppCompat等效方法)来再次强制执行OnCreateOptions菜单,这与之前的操作基本相同,即再次膨胀菜单,设置所有的菜单项等。所有这些工作,只是为了改变的可见性说。。。一项

我在谷歌看到的所有样本中都看到了同样的东西。就我的一生而言,我无法理解为什么所有这些不合理的开销都会发生(膨胀菜单等),而如果您只在本地保持菜单引用,并调用自定义方法,比如。。。调整菜单(菜单菜单引用),它不必膨胀菜单并再次创建,只需对已创建的菜单进行必要的修改即可。所以这类事情:


最有可能的原因是谷歌的方式(通过一次又一次地强制OnCreateOptions菜单),因为谷歌的示例也这么做,但由于我自己无法找出原因,也许有人可以帮我一下,然后告诉我这个原因。

您应该只在onCreateOptions菜单()中真正扩展您的选项菜单

如果只在本地保持菜单引用,那么所有这些都可以完成

您可以通过方法onPrepareOptions功能表(菜单)在本地执行此操作。这实际上是一个设置菜单项可见性的好地方。关于调用InvalidateOptions菜单()的重要性问题;它的目的应该从两个角度来看待

在API 11和引入片段之前,对InvalidateOptions菜单的调用将发出信号,表明应该再次调用方法onCreateOptions菜单()和onPrepareOptions菜单()。由于活动通常只有一个选项菜单,因此菜单对象可以保存在内存中,以便后续调用onCreateOptionsMenu()更具响应性

自API 11发布以来,选项菜单不能再像以前那样存储在内存中,因为引入片段意味着活动及其每个片段都可以有自己的选项菜单,并且片段可以在活动的生命周期内动态更改,为每个片段存储一组选项菜单是低效的,因为这些片段不能保证留在屏幕上。还要记住,在API 11+中,操作栏上可以显示选项菜单项。将手机配置从纵向更改为横向意味着操作栏上可以显示更多选项菜单项,因此溢出菜单中的项目现在可以移动到操作栏本身。另一种尽管速度较慢的解决方案是从头开始重建所有屏幕片段的选项菜单。因此,对于API 11+,对InvalidateOptions菜单()的调用可以被视为一个信号,指示活动片段的布局已更改,并且应该为活动及其当前承载的片段调用onCreateOptions菜单()和onPrepareOptions菜单()方法


查看InvalidateOptions功能表(Activity Activity)上的条目,了解使用InvalidateOptions功能表的更多信息。

在您提到的部分中,没有说明调用此方法的原因(实际上,它强制11+系统上的OnCreateOptions功能表方法)不是本地存储菜单引用,而是在该引用上操作。只是在InvalidateOptions菜单中添加了进一步的解释,希望这能有所帮助。好的,多亏了你,我学到了一些以前没有学到的东西。我找到了一个教程,它让我意识到我对Fragment的OnCreateOptions菜单的功能有错误的理解。它不会替换活动的“已创建”菜单,而是添加到其中(至少这是默认行为)。所以现在在菜单上调用invalidate更有意义了,不过我还没有被卖掉。我没有被卖掉,因为我发现了一件事,现在我知道菜单引用实际上保持不变,不管有多少碎片。但是既然你给我指明了正确的方向,这辆车就是你的了。