Android Navigation Component and the BackStack

Using Android’s Navigation Component, I wanted to keep certain fragments from appearing on the backstack. Here’s how to do it.

Why?

There’s a couple of situations where you may not want a fragment to re-appear when navigating back. One is for a login/authentication fragment. e.g. you have a flow A -> login -> B, but navigating back from B should return to A, i.e. B -> A.

Another situation is A -> B1 <-> B2 -> C. For example, B1 is a map fragment, and B2 shows the same information in list form; the user may switch between B1 and B2 multiple times, before navigating to C to display an item’s full details. Navigating back from C should return to B1/B2, and then back to A. i.e. A -> B1 -> B2 -> B1 -> B2-> C -> B2 -> A.

How?

Taking the case of A -> Login -> B fragments, we modify the navigation action:

<action
  android:id="@+id/action_fragmentLogin_to_fragmentB"
  app:destination="@id/fragmentB"
/>

and add popUpTo to pop the current fragment off the backstack:

<action
  android:id="@+id/action_fragmentLogin_to_fragmentB"
  app:destination="@id/fragmentB"
  app:popUpTo="@id/fragmentLogin"
  app:popUpToInclusive="true"
/>

Now, navigating back from fragment B will return to fragment A.

Comments