web-dev-qa-db-fra.com

Comment remplacer un fragment à l'aide de NavController.Navigate au lieu de l'ajouter sur le dessus

J'utilise le "nouveau" Android Jetpack Navigation, au lieu de s'appuyer sur FragmentManager. J'ai une simple mise en page principale:

<?xml version="1.0" encoding="utf-8"?>
<Android.support.constraint.ConstraintLayout
        xmlns:Android="http://schemas.Android.com/apk/res/Android"
        xmlns:tools="http://schemas.Android.com/tools"
        xmlns:app="http://schemas.Android.com/apk/res-auto"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        tools:context=".activities.MainActivity">

    <FrameLayout
            Android:id="@+id/root"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintBottom_toTopOf="@id/bottomNav">

        <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/navigation_app" />

    </FrameLayout>
    <com.google.Android.material.bottomnavigation.BottomNavigationView
            Android:id="@+id/bottomNav"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            app:menu="@menu/bottom_menu"
            app:layout_constraintBottom_toBottomOf="@+id/root"/>



</Android.support.constraint.ConstraintLayout>

Et deux mises en page supplémentaires: "SplashScreen" avec un TextView, "Connexion" avec un bouton. Le fragment SlashScreen est utilisé comme point de départ et a un auditeur défini comme suit:

override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        textView.setOnClickListener{
            findNavController(nav_Host_fragment).navigate(R.id.action_splashScreenFragment_to_loginFragment)
        }
    }

capture d'écran

Au lieu de remplacer TextView fragment avec un fragment de bouton, le fragment de bouton est empilé sur le dessus.

Je n'ai rencontré que des travaux de contournement tels que la définition d'une couleur d'arrière-plan et un paramètre cliquable, que je considère comme plus un piratage, car je pense que le comportement est exactement le même, mais le fragment ci-dessous est simplement caché. Comment utiliser correctement des fragments à l'aide de la NavController?

6
nluk

Vous devez utiliser popUpTo et popUpToInclusive pour effacer le dossertique. Vérifiez les DOCS DE DÉVELOPPERS Android

0
budgie