18

我正在使用导航MainActivity然后我开始SecondActivity(为了结果)。完成后SecondActivity我想继续导航MainActivity,但FragmentManager已经保存了他的状态。

Navigation.findNavController(view).navigate(R.id.action_next, bundle)我收到日志消息时:

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

我怎样才能继续导航?

4

5 回答 5

9

您必须始终调用super.onActivityResult()Activity 的onActivityResult. 那就是:

  1. 解锁 Fragments,以便他们可以进行 Fragment 事务(即,避免state is already saved错误)

  2. onActivityResult将回调调度到调用startActivityForResult.

于 2019-03-08T18:56:41.190 回答
7

super.onPostResume()最后,我在导航到恢复状态之前通过简单的调用来解决这个问题。

于 2019-01-17T09:45:49.490 回答
1

我已经通过这种方式解决了这个问题:

    @Override
public void onActivityResult() { //inside my fragment that started activity for result
        model.navigateToResults = true; //set flag, that navigation should be performed
}

进而

    @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);
    }
}

不确定,如果这不是一个可怕的黑客,但它对我有用。此时会恢复 FramgentManager 状态 (onResume),并且不会出现导航问题。

于 2018-11-30T09:18:23.430 回答
1

我相信上述解决方案应该有效。但我的问题不同。有一个第三方 sdk 使用我提供的上下文启动其活动,并将结果传递给我必须实现的侦听器。

所以我没有选择合作onActivityResult:(

我用下面的黑客来解决这个问题:

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


让我知道是否有更好的解决方案。目前我发现这非常简单且易于实现:)

于 2020-01-03T06:48:28.457 回答
1

在导航之前调用 super.onPostResume() ......它正在工作

于 2020-03-09T10:32:07.383 回答