Reputation: 7114
I'm using navigation in MainActivity
, then I start SecondActivity
(for result). After finish of SecondActivity
I would like to continue with navigation in MainActivity
, but FragmentManager
has saved his state already.
On Navigation.findNavController(view).navigate(R.id.action_next, bundle)
I receive log message:
Ignoring navigate() call: FragmentManager has already saved its state
How I can continue in navigation?
Upvotes: 22
Views: 8550
Reputation: 178
I believe above solutions should work. But my problem was different. There was a third party sdk which was launching its activity using context provided by me and it was delivering the result on a listener which I had to implement.
So there was no option for me to work with onActivityResult
:(
I used below hack to solve the issue:
private var runnable: Runnable? = null // Runnable object to contain the navigation code
override fun onResume() {
super.onResume()
// run any task waiting for this fragment to be resumed
runnable?.run()
}
override fun responseListener(response: Response) { // Function in which you are getting response
if (!isResumed) {
// add navigation to runnable as fragment is not resumed
runnable = Runnable {
navController.navigate(R.id.destination_to_navigate)
}
} else {
// navigate normally as fragment is already resumed
navController.navigate(R.id.destination_to_navigate)
}
}
Let me know if there is any better solution for this. Currently I found this very simple and easy to implement :)
Upvotes: 2
Reputation: 200110
You must always call super.onActivityResult()
in your Activity's onActivityResult
. That is what:
Unlocks Fragments so they can do fragment transactions (i.e., avoid the state is already saved
errors)
Dispatches onActivityResult
callbacks to Fragments that called startActivityForResult
.
Upvotes: 10
Reputation: 7114
Finally, I fix the issue by simple calling super.onPostResume()
right before navigating to restore state.
Upvotes: 7
Reputation: 1820
I've solved this problem this way:
@Override
public void onActivityResult() { //inside my fragment that started activity for result
model.navigateToResults = true; //set flag, that navigation should be performed
}
and then
@Override
public void onResume() { //inside fragment that started activity for result
super.onResume();
if(model.navigateToResults){
model.navigateToResults = false;
navController.navigate(R.id.action_startFragment_to_resultsFragment);
}
}
not sure, if this is not a terrible hack, but it worked for me. FramgentManager state is restored at this point (onResume) and no problems with navigation occur.
Upvotes: 1