Android应用点击Courses按钮启动Activity时出现空指针异常求助
解决Courses Activity启动时的空指针异常
问题根源
报错java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.android.material.bottomnavigation.BottomNavigationView.setSelectedItemId(int)' on a null object reference,本质是你在Courses类里调用bottomNavigationView.setSelectedItemId(R.id.courses)时,bottomNavigationView为null——因为activity_courses.xml布局文件里完全没有id为bottom_navigator的BottomNavigationView控件,findViewById(R.id.bottom_navigator)找不到目标控件,自然返回null。
修复步骤
1. 给activity_courses布局添加BottomNavigationView
打开activity_courses.xml,在ConstraintLayout内部添加底部导航栏控件,通常固定在页面底部,示例代码如下:
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> <!-- 原有的Button、TextView代码保持不变 --> <!-- 添加底部导航栏 --> <com.google.android.material.bottomnavigation.BottomNavigationView android:id="@+id/bottom_navigator" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?android:attr/windowBackground" app:layout_constraintBottom_toBottomOf="parent" app:menu="@menu/bottom_nav_menu" /> <!-- 关联你定义的底部导航菜单,需包含home、dashboard、courses三个item --> </androidx.constraintlayout.widget.ConstraintLayout>
需要确保项目中存在对应的菜单文件(比如res/menu/bottom_nav_menu.xml),菜单示例如下:
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/home" android:title="Home" android:icon="@drawable/ic_home"/> <item android:id="@+id/dashboard" android:title="Dashboard" android:icon="@drawable/ic_dashboard"/> <item android:id="@+id/courses" android:title="Courses" android:icon="@drawable/ic_courses"/> </menu>
2. (可选)添加非空判断加固代码
如果担心布局加载异常,可在Courses类中给bottomNavigationView添加非空判断,避免意外崩溃:
bottomNavigationView = findViewById(R.id.bottom_navigator); if (bottomNavigationView != null) { bottomNavigationView.setSelectedItemId(R.id.courses); bottomNavigationView.setOnItemSelectedListener(new NavigationBarView.OnItemSelectedListener() { @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { switch (item.getItemId()){ case R.id.dashboard: startActivity(new Intent(getApplicationContext(), Dashboard.class)); overridePendingTransition(0,0); return true; case R.id.home: startActivity(new Intent(getApplicationContext(),MainActivity.class)); overridePendingTransition(0, 0); return true; case R.id.courses: return true; } return true; } }); }
内容的提问来源于stack exchange,提问作者samuel owoade
相关产品推荐
相关产品推荐

