书籍
《第一行代码 Android》第三版
开发 环境
Android Studio Jellyfish | 2023.3.1
创建Menu资源
在《第一行代码 Android》中的3.2.5 在Activity中使用Menu章节中,根据书中指引,在res/目录下创建menu目录,然后在menu目录下创建main.xml的布局资源.
menu:必选标签。用来定义一个菜单,菜单内所有的选项(item)都需要写在<menu/>标签内,同时它也是整个 menu 资源文件的根节点。(这个在创建main.xml时android studio自动生成menu的部分代码)
item:必选标签。用来创建一个菜单项,每一个<item/>标签代表 menu 中的一个选项,另外在 <item/>中我们还可以嵌套定义<menu/>节点,以此来创建一个子菜单。(此段代码中我们创建了两个item,分别是add_item和remove_item)
(这段代码的具体意思书中讲解的比较清楚,因此不在此处细讲,可参考书中内容.)
<menu xmlns:android="http://schemas.android.com/apk/res/android"><itemandroid:id="@+id/add_item"android:title="Add"/><itemandroid:id="@+id/remove_item"android:title="Remove"/></menu>
重写onCreateOptionsMenu()方法
本人基本上是没有java/android基础的,onCreateOptionsMenu()和onOptionsItemSelected()都是首次使用,重写的代码的细节直接看《第一行代码 Android》描述即可,此处我想简单整理一下关于这两个函数的定义:
onCreateOptionsMenu()顾名思义是创建选项菜单, Activity 创建 Option Menu 的时候系统会回调此函数,我们需要在该函数内绑定我们定义的菜单main.xml的资源.
menuInflater.inflate()表示调用getMenuInflater()中的inflate()给当前Activity创建菜单.
R.menu.main表示的指定res/menu/main.xml中的菜单资源;
menu是入参中的menu,原文中"第二个参数用于指定我们的菜单项将添加到哪一个Menu对象当中,这里直接使用onCreateOptionsMenu()方法中传入的menu参数。"我目前不是很理解.因为如上所说的onCreateOptionsMenu()是创建菜单时主动回调的函数,那么其参数在哪里传进来的我不知道.希望有经验的哥们可以指导一下.
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
// return super.onCreateOptionsMenu(menu)menuInflater.inflate(R.menu.main, menu)return true}
原文中,"最后给这个方法返回 true,表示允许创建的菜单显示出来,如果返回了false,创建的菜单将无法显示。"
可是我将true改为false,重新编译下载程序,这个菜单还是可见的,是我对这句话的理解有问题吗?希望有经验的哥们可以指导一下.
重写onOptionsItemSelected()
这个内容比较简单,就是重写onOptionsItemSelected()函数,这个函数是菜单响应事件, 当用户在菜单中点击了某个选项之后,Android 系统会回调onOptionsItemSelected()方法,并传入被选菜单项的 Menu 实例.
函数内部比较简单,就是用when条件语句判断传进来的itemId,对应执行不同的动作.
override fun onOptionsItemSelected(item: MenuItem): Boolean {
// return super.onOptionsItemSelected(item)when (item.itemId) {R.id.add_item->Toast.makeText(this, "Add", Toast.LENGTH_SHORT).show()R.id.remove_item -> Toast.makeText(this, "Remove", Toast.LENGTH_SHORT).show()}return true}
参考连接
34. 【Android教程】菜单:Menu_android menu菜单样式-CSDN博客