Android Toolbar开发中MenuItem无法响应选中事件问题
问题解答
1. onOptionsItemSelected 中 MenuItem 参数的定义
这个参数就是用户当前触发点击的那个菜单项的实例对象,和你在菜单XML里写的每一个<item>标签一一对应,内部存储了这个菜单项的ID、标题、图标、展示规则等全部属性,调用item.getItemId()就能拿到你在XML里给这个菜单项分配的ID,以此区分用户点击的是哪个选项。
2. 无法匹配菜单项的遗漏配置和现有错误
你现在的代码和配置有几个核心问题,按排查优先级列:
- 缺失菜单加载的必要回调:Activity不会自动加载你写的菜单XML文件,必须重写
onCreateOptionsMenu方法,把你的菜单布局填充进去,菜单才能正常显示、响应点击,需要在对应Activity中补充如下代码:
@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.替换为你自己的菜单XML文件名, menu); return true; }
- 如果你使用自定义
Toolbar而非系统原生ActionBar,还需要先把Toolbar设置为页面的支持ActionBar,否则菜单不会绑定到Toolbar上,点击事件也不会走这个回调:
// 先从布局中获取你定义的Toolbar实例,示例中Toolbar的id为toolbar Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar);
- 菜单XML存在语法错误:第二个item的多个属性闭合用了中文双引号,包括
android:id="@+id/motorcycle"、android:orderInCategory="50"、android:icon="@drawable/motorcycle"、app:showAsAction="always|collapseActionView"这几个位置的后引号都是中文全角符号,会导致编译异常,对应ID无法被R类正确识别,把这些引号全部替换为英文半角双引号即可。 - 点击回调逻辑存在漏洞:当前代码如果匹配不到你定义的两个菜单项(比如点击Toolbar自带的导航返回按钮),
message变量会为null,此时弹Toast会触发空指针;而且你默认对所有事件都返回true,会强行消费掉所有菜单事件,影响系统默认逻辑。建议补充default分支,未匹配的事件交给父类默认处理:
@Override public boolean onOptionsItemSelected(MenuItem item) { String message; switch(item.getItemId()) { case R.id.rockstar: message = "You clicked item 1"; break; case R.id.motorcycle: message = "You clicked on item 2"; break; default: return super.onOptionsItemSelected(item); } Toast.makeText(this, message, Toast.LENGTH_LONG).show(); return true; }
- 额外注意:你给第二个id为
motorcycle的菜单项配置了app:actionViewClass="android.widget.SearchView"属性,这个属性是用来给菜单项绑定内嵌搜索框组件的,如果作业只要求实现普通点击菜单项,把这行属性删掉即可,否则点击该菜单项会优先展开搜索框,不会触发你写的普通点击逻辑。
内容的提问来源于stack exchange,提问作者ReginaldRey
相关产品推荐
相关产品推荐

