Android Studio中onOptionsItemSelected点击无响应问题
问题根因
点击菜单项不触发回调的核心原因是API使用混淆,附带几个会导致功能异常的细节问题:
onCreateOptionsMenu、onOptionsItemSelected是Activity原生选项菜单(即ActionBar/顶部溢出菜单)的生命周期回调,只响应顶部选项菜单的点击事件,和你布局里添加的BottomNavigationView底部导航组件完全无关,底部导航的菜单项点击不会触发这两个回调。- 存在冗余代码:你重复加载了两次菜单,一次在Activity菜单回调里inflate菜单,一次在布局里通过
app:menu属性给BottomNavigationView绑定菜单。 - 存在资源ID冲突:布局里的悬浮按钮(FAB)ID和菜单项ID都命名为
home,会导致资源ID匹配异常。 - 代码细节错误:你写的Toast没有调用
.show()方法,就算逻辑走到了也不会弹出提示。
修复方案
按以下步骤修改代码即可:
- 直接删除Activity里重写的
onCreateOptionsMenu方法,BottomNavigationView的菜单已经在布局里通过app:menu属性完成加载,不需要重复inflate。 - 删掉菜单XML文件里ID为
home的空title菜单项——中间的首页按钮是独立的悬浮按钮,不属于底部导航的菜单项,留着这个空item会导致底部导航出现无内容的占位,造成布局错位。 - 修改布局里悬浮按钮的ID,解决重名冲突,比如把
android:id="@+id/home"改成android:id="@+id/homeFab"。 - 在Activity的
onCreate方法里,setContentView调用之后,分别给底部导航、悬浮按钮设置单独的点击监听,不要依赖Activity的菜单回调,参考代码如下:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 处理底部导航菜单项点击 BottomNavigationView bottomNavigationView = findViewById(R.id.bottomNavigationView); bottomNavigationView.setOnItemSelectedListener(item -> { int itemId = item.getItemId(); if (itemId == R.id.leftNav) { Toast.makeText(MainActivity.this, "Click left", Toast.LENGTH_LONG).show(); return true; } else if (itemId == R.id.rightNav) { // 右侧菜单点击逻辑写在这里 return true; } return false; }); // 处理中间首页悬浮按钮点击 FloatingActionButton homeFab = findViewById(R.id.homeFab); homeFab.setOnClickListener(v -> { Toast.makeText(MainActivity.this, "Click home", Toast.LENGTH_LONG).show(); // 首页按钮点击逻辑写在这里 }); }
- 后续写Toast提示的时候记得最后调用
.show(),否则提示不会弹出。
内容的提问来源于stack exchange,提问作者Mohtep
相关产品推荐
相关产品推荐

