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.