[英]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()
。 那就是:
解锁片段以便他们可以进行片段交易(即避免state is already saved
错误)
将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.