40 votes

FragmentContainerView à l'aide de findNavController

J'utilise Android Navigation Composant avec navigation en bas, les peluches donne un avertissement sur le remplacement du <fragment> étiquette avec FragmentContainerView mais quand j'ai remplacé, findNavController ne fonctionne pas , il me donne une erreur à ce sujet n'a pas de NavController activé

Fragment

 <androidx.fragment.app.FragmentContainerView
            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/mobile_navigation" />

Activité

 val navController = findNavController(R.id.nav_host_fragment)
    
    val appBarConfiguration = AppBarConfiguration(
        setOf(
            R.id.navigation_classes, R.id.navigation_schedule, R.id.navigation_settings
        )
    )
    setupActionBarWithNavController(navController, appBarConfiguration)
    navView.setupWithNavController(navController)
}

6voto

friederbluemle Points 796

Remplacez cette ligne :

 NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);

avec

 NavController navController = getNavController();

getNavController() ressemble à ceci :

     // workaround for https://issuetracker.google.com/issues/142847973
    @NonNull
    private NavController getNavController() {
        Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment);
        if (!(fragment instanceof NavHostFragment)) {
            throw new IllegalStateException("Activity " + this
                    + " does not have a NavHostFragment");
        }
        return ((NavHostFragment) fragment).getNavController();
    }

3voto

Joao Gavazzi Points 802

En plus de la réponse acceptée, un petit raccourci qui pourrait être utilisé est :

 supportFragmentManager.findFragmentById(R.id.navHostMain)?.findNavController()

Salutations

1voto

Yuri Barbosa Points 11

J'ai résolu mon problème avec l'extension:

 fun FragmentActivity.findFragmentContainerNavController(@IdRes host: Int):NavController {
    try {
        val navHostFragment = supportFragmentManager.findFragmentById(host) as NavHostFragment
        return navHostFragment.findNavController()
    } catch (e: Exception) {
        throw IllegalStateException("Activity $this does not have a NavController set on $host")
    }
}

0voto

Hank Chan Points 152

Il existe un moyen encore plus simple de répondre à @friederbluemle. Une vérification d'assertion devrait suffire.

 NavHostFragment navHostFragment 
    = (NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment);
assert navHostFragment != null : "navHostFragment not found";
NavController navController = navHostFragment.getNavController();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X