Francis
Francis

Reputation: 7114

Ignoring navigate() call: FragmentManager has already saved its state

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

Answers (5)

shashank J
shashank J

Reputation: 77

call super.onPostResume() before navigation....It's working

Upvotes: 0

Tarun Chauhan
Tarun Chauhan

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

ianhanniballake
ianhanniballake

Reputation: 200110

You must always call super.onActivityResult() in your Activity's onActivityResult. That is what:

  1. Unlocks Fragments so they can do fragment transactions (i.e., avoid the state is already saved errors)

  2. Dispatches onActivityResult callbacks to Fragments that called startActivityForResult.

Upvotes: 10

Francis
Francis

Reputation: 7114

Finally, I fix the issue by simple calling super.onPostResume() right before navigating to restore state.

Upvotes: 7

insomnium_
insomnium_

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

Related Questions