繁体   English   中英

忽略导航()调用:FragmentManager 已经保存了它的状态

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

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

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

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

如何继续导航?

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

  1. 解锁片段以便他们可以进行片段交易(即避免state is already saved错误)

  2. onActivityResult回调分派给调用startActivityForResult Fragment。

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

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

所以我没有选择使用onActivityResult :(

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

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


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

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

    @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),导航不会出现问题。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM