web-dev-qa-db-fra.com

Composant de navigation: impossible de trouver NavController

J'utilise le composant de navigation pour naviguer dans mon application. Cela fonctionne bien à l'intérieur des fragments mais il ne parvient pas à trouver l'hôte de navigation dans l'activité qui contient l'hôte de navigation réel.

J'essaie d'ouvrir un nouveau fragment lorsque l'utilisateur clique sur FAB, que j'ai inclus dans le XML de l'activité principale. Lorsque j'appelle findNavController (), il ne parvient pas à trouver le contrôleur. Le contrôleur d'hôte nav est dans la disposition XML. Je ne peux pas comprendre pourquoi il ne le trouve pas.

Activité principale

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)

        }
    }
}

Activité principale 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>
2
Jeremi

Le problème pourrait être que FAB a été ajouté à l'activité ou un fragment différent de celui utilisé par le fragment NavHost. Dans ce cas, lorsque vous appelez it.findNavController(), il ne trouve pas le contrôleur de navigation.

Vous pouvez soit vérifier que votre FAB appartient au fragment extrait par NavHost, soit appeler la findNavController(<id>) d'une activité et lui transmettre l'ID du fragment que vous recherchez.

override fun onCreate(savedInstanceState: Bundle?) {
        ...
        fab.setOnClickListener {
            findNavController(R.id.nav_Host_fragment)
                .navigate(R.id.R.id.addNewWorkoutFragment)

        }
    }
1
Slava Senchenko