Android中onCreateOptionsMenu与onPrepareOptionsMenu的正确调用语法
onCreateOptionsMenu()
首先明确:这个方法的核心是创建菜单并决定是否显示,返回true表示菜单会被系统展示,false则不会。
三种写法的分析
示例1(仅返回true):正确
当你完全自定义菜单(比如通过inflater.inflate加载自己的菜单布局),不需要依赖父类默认菜单内容时,直接填充菜单后返回true即可——你已经完成菜单创建,明确告知系统要显示该菜单。示例2(返回父类方法结果):不推荐,存在风险
AppCompatActivity的父类实现中,super.onCreateOptionsMenu(menu)默认可能返回false(比如父类未添加任何菜单项时)。如果自己填充了菜单却返回父类结果,一旦父类返回false,自定义菜单也会被系统隐藏,导致功能异常。示例3(先调用父类,再返回true):正确
若需要保留父类提供的默认菜单(比如系统ActionBar的默认项),先调用super.onCreateOptionsMenu(menu)让父类完成它的菜单创建,再添加自定义内容,最后返回true确保菜单正常显示。
统一写法建议
- 不需要父类默认菜单:直接填充自定义菜单,最后
return true。 - 需要父类默认菜单:先调用
super.onCreateOptionsMenu(menu),再添加自定义内容,最后return true。
onPrepareOptionsMenu()
这个方法的作用是在菜单即将显示前动态修改状态(比如显示/隐藏菜单项、修改标题等),返回值同样决定菜单是否显示。
两种写法的分析
示例1(返回父类方法结果):不推荐,依赖父类实现
虽然父类super.onPrepareOptionsMenu(menu)默认返回true,但如果后续Android框架修改父类实现,返回值变为false,你对菜单的修改就不会生效,菜单也无法显示。示例2(先调用父类,再返回true):正确
先调用super.onPrepareOptionsMenu(menu)让父类完成必要的准备工作(比如同步ActionBar状态),再修改自定义菜单项的状态,最后返回true明确告知系统要展示准备好的菜单。
统一写法建议
无论是否需要修改菜单,都先调用super.onPrepareOptionsMenu(menu),完成自定义修改后,强制返回true,确保菜单稳定显示。
内容的提问来源于stack exchange,提问作者priyamtheone

