How to clear navigation Stack after navigating to another fragment in Android How to clear navigation Stack after navigating to another fragment in Android android android

How to clear navigation Stack after navigating to another fragment in Android


First, add attributes app:popUpTo='your_nav_graph_id' and app:popUpToInclusive="true" to the action tag.

<fragment    android:id="@+id/signInFragment"    android:name="com.glee.incog2.android.fragment.SignInFragment"    android:label="fragment_sign_in"    tools:layout="@layout/fragment_sign_in" >    <action        android:id="@+id/action_signInFragment_to_usersFragment"        app:destination="@id/usersFragment"        app:launchSingleTop="true"        app:popUpTo="@+id/main_nav_graph"        app:popUpToInclusive="true" /></fragment>

Second, navigate to the destination, using above action as parameter.

findNavController(fragment).navigate(     SignInFragmentDirections.actionSignInFragmentToUserNameFragment())

See the docs for more information.

NOTE: If you navigate using method navigate(@IdRes int resId), you won't get the desired result. Hence, I used method navigate(@NonNull NavDirections directions).


I think your question specifically pertains on how to use the Pop Behavior / Pop To / app:popUpTo (in xml)

In documentation,
Pop up to a given destination before navigating. This pops all non-matching destinations from the back stack until this destination is found.

Example (Simple Job hunting app)
my start_screen_nav graph is like this:

startScreenFragment (start) -> loginFragment -> EmployerMainFragment                            -> loginFragment -> JobSeekerMainFragment

if I want to navigate to EmployerMainFragment and pop all including startScreenFragment then the code will be:

        <action            android:id="@+id/action_loginFragment_to_employerMainFragment"            app:destination="@id/employerMainFragment"            app:popUpTo="@+id/startScreenFragment"            app:popUpToInclusive="true" />

if I want to navigate to EmployerMainFragment and pop all excluding startScreenFragment then the code will be:

        <action            android:id="@+id/action_loginFragment_to_employerMainFragment"            app:destination="@id/employerMainFragment"            app:popUpTo="@+id/startScreenFragment"/>

if I want to navigate to EmployerMainFragment and pop loginFragment but not startScreenFragment then the code will be:

        <action            android:id="@+id/action_loginFragment_to_employerMainFragment"            app:destination="@id/employerMainFragment"            app:popUpTo="@+id/loginFragment"            app:popUpToInclusive="true"/>

OR

        <action            android:id="@+id/action_loginFragment_to_employerMainFragment"            app:destination="@id/employerMainFragment"            app:popUpTo="@+id/startScreenFragment"/>


In my case i needed to remove everything in the back Stack before i open a new fragment so i used this code

navController.popBackStack(R.id.fragment_apps, true);navController.navigate(R.id.fragment_company);

the first line removes the back Stack till it reaches the fragment specified in my case it's the home fragment so it's removes all the back stack completely , and when the user clicks back in the fragment_company he closes the app.