Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Navigation Component: Cannot find NavController

Tags:

I am using Navigation Component for navigating in my app. It works fine inside fragments but it fails to find the nav host in the activity that holds the actual navigation host.

I am trying to open a new fragment when the user clicks on FAB, which I included in Main activity's XML. When I call findNavController() it fails to find the controller. The nav host controller is in the XML layout. I can't understand why it fails to find it.

MainActivity

class MainActivity : AppCompatActivity(), OnActivityComponentRequest {     override fun getTabLayout(): TabLayout {         return this.tabLayout     }      override fun getFap(): FloatingActionButton {         return this.floatingActionButton     }      private lateinit var tabLayout: TabLayout     private lateinit var floatingActionButton: FloatingActionButton      override fun onCreate(savedInstanceState: Bundle?) {         super.onCreate(savedInstanceState)         setContentView(R.layout.activity_main)         setSupportActionBar(toolbar)         this.tabLayout = tabs         this.floatingActionButton = fab          fab.setOnClickListener {           it.findNavController().navigate(R.id.addNewWorkoutFragment)          }     } } 

Activity main XML

<?xml version="1.0" encoding="utf-8"?> <androidx.coordinatorlayout.widget.CoordinatorLayout         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"         tools:context=".domain.MainActivity"         android:animateLayoutChanges="true">      <com.google.android.material.appbar.AppBarLayout             android:layout_height="wrap_content"             android:layout_width="match_parent"             android:theme="@style/AppTheme.AppBarOverlay">          <androidx.appcompat.widget.Toolbar                 android:id="@+id/toolbar"                 android:layout_width="match_parent"                 android:layout_height="?attr/actionBarSize"                 android:background="?attr/colorPrimary"                 app:layout_scrollFlags="scroll|enterAlways"                 app:popupTheme="@style/AppTheme.PopupOverlay"/>          <com.google.android.material.tabs.TabLayout                 android:id="@+id/tabs"                 android:layout_width="match_parent"                 android:layout_height="wrap_content">              <com.google.android.material.tabs.TabItem                     android:text="Test 1"                     android:layout_height="match_parent"                     android:layout_width="match_parent"/>              <com.google.android.material.tabs.TabItem                     android:text="Test 2"                     android:layout_height="match_parent"                     android:layout_width="match_parent"/>         </com.google.android.material.tabs.TabLayout>      </com.google.android.material.appbar.AppBarLayout>        <fragment         android:id="@+id/nav_host_fragment"         android:name="androidx.navigation.fragment.NavHostFragment"         android:layout_width="match_parent"         android:layout_height="match_parent"         app:defaultNavHost="true"         app:navGraph="@navigation/main_navigation" />       <com.google.android.material.bottomappbar.BottomAppBar             android:id="@+id/bar"             android:layout_width="match_parent"             android:layout_height="wrap_content"             android:layout_gravity="bottom"/>       <com.google.android.material.floatingactionbutton.FloatingActionButton             android:id="@+id/fab"             android:layout_width="wrap_content"             android:layout_height="wrap_content"             app:layout_anchorGravity="right|top"             app:layout_anchor="@+id/bar"             android:src="@drawable/ic_add_black_24dp"/>  </androidx.coordinatorlayout.widget.CoordinatorLayout> 
like image 513
Jeremi Avatar asked Dec 23 '18 09:12

Jeremi


People also ask

What is NavController in Android?

NavController manages app navigation within a NavHost . Apps will generally obtain a controller directly from a host, or by using one of the utility methods on the Navigation class rather than create a controller directly. Navigation flows and destinations are determined by the navigation graph owned by the controller.

How do you enable your project to use navigation components?

In the Project window, right-click on the res directory and select New > Android Resource File. The New Resource File dialog appears. Type a name in the File name field, such as "nav_graph". Select Navigation from the Resource type drop-down list, and then click OK.

What is popUpToInclusive?

When navigating back to destination A, we also popUpTo A, which means that we remove B and C from the stack while navigating. With app:popUpToInclusive="true" , we also pop that first A off of the stack, effectively clearing it.


Video Answer


1 Answers

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.

like image 110
LightMan Avatar answered Oct 16 '22 03:10

LightMan