问题
I am trying to use the navigation controller right now. I want to move from LoginFragment
to HomeFragment
. In LoginFragment
I use this code below to move to HomeFragment
.
Navigation.findNavController(view).navigate(homeDestination)
However, when I tap the back button in the HomeFragment
, it will go back to LoginFragment
, I expect that when I tap the button it will close the app.
In old way, if I use activity instead of using Fragment
, I usually do something like this to get that expected behaviour:
val intent = Intent(this,HomeActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TASK.or(Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(intent)
By using those flags, I use to get the expected behavior. But I don't how to implement the same behavior using the navigation controller.
回答1:
Navigation offers a popUpTo
and popUpToInclusive
attributes for removing fragments from the back stack as part of a navigate()
operation.
This can be set either in XML:
<!-- Add to your Navigation XML, then use navigate(R.id.go_home) -->
<action
android:id="@+id/go_home"
app:destination="@+id/home_fragment"
app:popUpTo="@+id/destination_to_pop"
app:popUpToInclusive="true"/>
Or set it programmatically:
NavOptions navOptions = new NavOptions.Builder()
.setPopUpTo(R.id.destination_to_pop, true)
.build();
Navigation.findNavController(view).navigate(homeDestination, navOptions)
You can also use the id of a <navigation>
element as well.
回答2:
I think this should do the trick.
NavController controller = Navigation.findNavController(view);
controller.popBackStack(R.id.fragmentLogin, true);
controller.navigate(homeDestination)
来源:https://stackoverflow.com/questions/54919101/how-to-prevent-previous-fragment-to-show-up-after-pressing-back-button-using-nav