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

前端 未结 5 2230
逝去的感伤
逝去的感伤 2021-02-08 01:19

I\'m using navigation in MainActivity, then I start SecondActivity (for result). After finish of SecondActivity I would like to continue w

相关标签:
5条回答
  • 2021-02-08 01:59

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

    0 讨论(0)
  • 2021-02-08 02:00

    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.

    0 讨论(0)
  • 2021-02-08 02:04

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

    0 讨论(0)
  • 2021-02-08 02:07

    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 :)

    0 讨论(0)
  • 2021-02-08 02:15

    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.

    0 讨论(0)
提交回复
热议问题