Please make sure to read the full question before marking it as repeated.
I am well aware of popUpto, popUpToInclusive and launchSingleTop attributes on navigation xml. They simply do NOT apply when navigating from a FRAGMENT to a ACTIVITY (even though they still appear in the navigation xml). I have tried dozens of different solutions and I am searching for an answer to this for the past 3 days!
To let you guys know, this is the ONLY solution so far that actually works: https://stackoverflow.com/a/59795636/6952763
But the solution itself is so ugly that I am not willing to implement it myself. Relaunching the same activity and accepting the flashing black screen when doing it for me just doesn't seem like an option.
The closest I have got from a good working solution was https://stackoverflow.com/a/63566415/6952763 which is based on https://stackoverflow.com/a/63169732/6952763 but for some reason when adding the combination of Intent.FLAG_ACTIVITY_CLEAR_TASK
together with Intent.FLAG_ACTIVITY_NEW_TASK
results on the target Activity to be created/destroyed/recreated multiple times (around 8 times). It's easy to achieve it when navigating between Fragments. Just the xml parameters that I mentioned above already do the work. The ask here is from FRAGMENT to ACTIVITY which is giving me headaches :D
Summarising the question: I want to completely clear the backstack when going from FRAGMENT_Login (example) to ACTIVITY_home using Navigation Component. Any idea how to achieve this?
So far, my code is something around this:
FRAGMENT ORIGIN
private fun proceedToHome(user: UserEntity?){
if(user != null && user.id != 0L){
val direction = LoginFragmentDirections.actionLoginToMainHostActivity(user.id)
val extras = ActivityNavigator.Extras.Builder()
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
.build()
val navOptions = NavOptions.Builder()
.setLaunchSingleTop(true)
.build()
findNavController().navigate(direction.actionId, direction.arguments, navOptions, extras)
}
}
ACTIVITY DESTINATION:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val mBinding = ActivityMainHostBinding.inflate(layoutInflater)
setContentView(mBinding.root)
navController = (supportFragmentManager.findFragmentById(R.id.activity_main_host_content) as NavHostFragment).navController
navController.setGraph(R.navigation.main_host_navigation, intent.extras)
mBinding.activityMainHostNavigationView.setupWithNavController(navController)
}
The code above causes the Activity to be created/destroyed/recreated multiple times and based on my tests I think it's the combination of those 2 Intent flags I am using. If I use only Intent.FLAG_ACTIVITY_CLEAR_TASK
or only Intent.FLAG_ACTIVITY_NEW_TASK
then I don't get the issue but also don't clear the backstack so when user presses back button on the activity he is brought back to the fragment.
I could just call requireActivity().finish()
on the origin fragment but that also seems like a hack. I feel like all I am missing is some sort of detail about the use of those flags...
Any help will be deeply appreciated! <3