Search code examples
android-studiokotlinnullpointerexceptionbottomnavigationview

Bottom Navigation View with activities not working in Kotlin


I am new to Kotlin, so I am having trouble on how to solve this.

I have created a bottom navigation view that I am using to switch between activities. When I call the BottomNavigationView.OnNavigationItemSelectedListener my app crashes and I dont know why. Can anyone please help?

I have searched, but I only find answers on fragments.

My MainActivity code:

class MainActivity : AppCompatActivity() {

private val navigasjonen = BottomNavigationView.OnNavigationItemSelectedListener { item ->
    when (item.itemId) {
        R.id.home -> {
            return@OnNavigationItemSelectedListener false
        }
        R.id.leggTilNavigasjon -> {
            val intent = Intent(this@MainActivity, AddRec::class.java)
            startActivity(intent)
            return@OnNavigationItemSelectedListener true
        }
        R.id.favoritter -> {
            val intent = Intent(this@MainActivity, MyRecipes::class.java)
            startActivity(intent)
            return@OnNavigationItemSelectedListener true
        }
        R.id.utforsk -> {
            return@OnNavigationItemSelectedListener true
        }
    }
    false

}

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val bottomNavigation = findViewById<BottomNavigationView>(R.id.bottom_navigation)
    //bottomNavigation.setSelectedItemId(R.id.home)
    bottomNavigation.setOnNavigationItemSelectedListener(navigasjonen)

}

}

My xml code:

<?xml version="1.0" encoding="utf-8"?>
<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"
    android:background="@color/colorLys"
    android:id="@+id/home">

    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/navigationView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        android:background="?android:attr/windowBackground"
        app:menu="@menu/navigasjon" />
</androidx.constraintlayout.widget.ConstraintLayout>

My error:

2020-01-27 14:20:06.197 20309-20309/com.example.foodleaks E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.foodleaks, PID: 20309 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.foodleaks/com.example.foodleaks.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.android.material.bottomnavigation.BottomNavigationView.setOnNavigationItemSelectedListener(com.google.android.material.bottomnavigation.BottomNavigationView$OnNavigationItemSelectedListener)' on a null object reference at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2913) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main(ActivityThread.java:6669) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.android.material.bottomnavigation.BottomNavigationView.setOnNavigationItemSelectedListener(com.google.android.material.bottomnavigation.BottomNavigationView$OnNavigationItemSelectedListener)' on a null object reference at com.example.foodleaks.MainActivity.onCreate(MainActivity.kt:39) at android.app.Activity.performCreate(Activity.java:7136) at android.app.Activity.performCreate(Activity.java:7127) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)  at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)  at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)  at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)  at android.os.Handler.dispatchMessage(Handler.java:106)  at android.os.Looper.loop(Looper.java:193)  at android.app.ActivityThread.main(ActivityThread.java:6669)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 


Solution

  • In your findViewById you are passing R.id.bottom_navigation:

    val bottomNavigation = findViewById<BottomNavigationView>(R.id.bottom_navigation)
    

    and in the layout it has the id:

    android:id="@+id/navigationView"
    

    You can either change the id on the layout:

    android:id="@+id/bottom_navigation"
    

    Or change it in the findViewById:

    val bottomNavigation = findViewById<BottomNavigationView>(R.id.navigationView)
    

    Be consistent so that it can find the BottomNavigationView element and it won't crash for a null object reference.