If you’re facing issues where the Navigation Component is not working in Kotlin, you’re not alone. Many Android developers encounter crashes, blank screens, or navigation not responding as expected. This article walks you through the common causes, how to resolve them, and includes a full working example separated by class.

Common Problems
- Missing NavHostFragment
- Incorrect navigation graph reference
- Wrong Fragment or Activity setup
- Incomplete dependencies or lifecycle setup
Full Working Example Using Navigation Component
1. build.gradle (app level)
dependencies { implementation "androidx.navigation:navigation-fragment-ktx:2.7.0" implementation "androidx.navigation:navigation-ui-ktx:2.7.0" }
2. res/navigation/nav_graph.xml
<?xml version="1.0" encoding="utf-8"?> <navigation xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/nav_graph" app:startDestination="@id/homeFragment"> <fragment android:id="@+id/homeFragment" android:name="com.example.app.HomeFragment" android:label="Home" > <action android:id="@+id/action_homeFragment_to_detailFragment" app:destination="@id/detailFragment" /> </fragment> <fragment android:id="@+id/detailFragment" android:name="com.example.app.DetailFragment" android:label="Detail" /> </navigation>
3. MainActivity.kt
package com.example.app import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import androidx.navigation.fragment.NavHostFragment import androidx.navigation.ui.setupActionBarWithNavController class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val navHostFragment = supportFragmentManager .findFragmentById(R.id.nav_host_fragment_container) as NavHostFragment val navController = navHostFragment.navController setupActionBarWithNavController(navController) } override fun onSupportNavigateUp(): Boolean { val navController = supportFragmentManager .findFragmentById(R.id.nav_host_fragment_container) ?.findNavController() return navController?.navigateUp() ?: false } }
4. activity_main.xml
<androidx.fragment.app.FragmentContainerView android:id="@+id/nav_host_fragment_container" android:layout_width="match_parent" android:layout_height="match_parent" app:navGraph="@navigation/nav_graph" app:defaultNavHost="true" android:name="androidx.navigation.fragment.NavHostFragment" />
5. HomeFragment.kt
package com.example.app import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.navigation.fragment.findNavController import com.example.app.databinding.FragmentHomeBinding class HomeFragment : Fragment() { private lateinit var binding: FragmentHomeBinding override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { binding = FragmentHomeBinding.inflate(inflater, container, false) return binding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) binding.buttonNavigate.setOnClickListener { findNavController().navigate(R.id.action_homeFragment_to_detailFragment) } } }
6. DetailFragment.kt
package com.example.app import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import com.example.app.databinding.FragmentDetailBinding class DetailFragment : Fragment() { private lateinit var binding: FragmentDetailBinding override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { binding = FragmentDetailBinding.inflate(inflater, container, false) return binding.root } }
Tips for Debugging
- Ensure you’re using the correct
NavHostFragment
- Use
findNavController()
within Fragments - Use
setupActionBarWithNavController()
if needed - Avoid calling
navigate()
before view is created
For more guidance on Android Navigation Component, check the official documentation.