Android Studio中MDC导航栏无法重写setOnItemSelectedListener问题
一、匿名内部类方式(修正你的方式一)
你的方式一逻辑本身没问题,报错大概率是调用或资源配置问题,先确保代码正确落地:
private void setupBottomNavigation() { NavigationBarView navigationBarView = findViewById(R.id.bottom_navigation); navigationBarView.setOnItemSelectedListener(new NavigationBarView.OnItemSelectedListener() { @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { // 必须导入android.view.MenuItem,别用其他包下的MenuItem类 switch (item.getItemId()) { case R.id.item_1: // 写item1的处理逻辑,比如跳转Fragment return true; case R.id.item_2: // 写item2的处理逻辑 return true; default: return false; } } }); }
关键注意:要在Activity的onCreate()方法里调用setupBottomNavigation(),不然监听不会绑定到导航栏上。
二、Lambda表达式方式(修正你的方式二)
你的方式二完全用错了参数格式——把NavigationBarView.OnItemSelectedListener和AdapterView.OnItemClickListener的接口搞混了。前者的抽象方法只接收一个MenuItem参数,正确Lambda写法如下(要求项目支持Java 8及以上):
private void setupBottomNavigation() { NavigationBarView navigationBarView = findViewById(R.id.bottom_navigation); navigationBarView.setOnItemSelectedListener(item -> { switch (item.getItemId()) { case R.id.item_1: // 处理逻辑 return true; case R.id.item_2: // 处理逻辑 return true; default: return false; } }); }
常见报错排查点
- R.id.item_1不存在:检查底部导航的菜单资源文件(一般是
res/menu/bottom_nav_menu.xml),确保菜单项id和代码里的完全一致,示例配置:<menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/item_1" android:title="首页" android:icon="@drawable/ic_home"/> <item android:id="@+id/item_2" android:title="我的" android:icon="@drawable/ic_profile"/> </menu> - MenuItem导入错误:必须导入
import android.view.MenuItem;,如果导入了 androidx 包下的MenuItem,会导致getItemId()报错。 - Java版本不支持Lambda:如果Lambda写法报错,在Module级别的
build.gradle里配置Java 8支持:android { compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } }
内容的提问来源于stack exchange,提问作者Li's hideout
相关产品推荐
相关产品推荐

