Navigation Component: Cannot find NavController

I was getting the same exeception until I managed to get the navController this way:

val navHostFragment = supportFragmentManager.findFragmentById(R.id.my_fragment_container_view_id) as NavHostFragment
val navController = navHostFragment.navController

Obtained from this answer:

Before finding the nav controller, you need to set the view, if you are using binding:

binding = BaseLayoutBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view)

If not:

setContentView(R.layout.activity_main)

Use the corresponding binding for fragments.


In Java you can find NavController inside activity this way:

Navigation.findNavController(this,R.id.nav_host).navigate(R.id.YourFragment);

Try setting up onClickListener of Fab button in onStart of the Activity as in onCreate Activity is just inflating the View and haven't set the NavHostController. So if you setup onClickListener in onStart of activity is will work as expected.

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    setSupportActionBar(toolbar)
    this.tabLayout = tabs
    this.floatingActionButton = fab
  }

override fun onStart() {
    super.onStart()
    floatingActionButton.setOnClickListener {
      it.findNavController().navigate(R.id.addNewWorkoutFragment)
    }
  }