我正在使用NavController:Navigation.findNavController(activity, R.id.statistic_host_fragment)
。一切都很好,直到我旋转设备,然后才能navigate()
和popBackStack()
。
在日志中: FragmentNavigator:忽略popBackStack()调用:FragmentManager已经保存了其状态,并且 FragmentNavigator:忽略navigation()调用:FragmentManager已保存其状态
当我看到Google Sample时,他们对这个问题一无所知,一切正常。所以我不明白那是问题所在。
此外,当我使用 MVVM 时,我将navController保存在viewModel中,并在 onCreate()之后在viewModel中重新初始化控制器。它旋转后解决了navigation()问题,但我仍然无法popBackStack()。之后,我尝试使用Navigation.setViewNavController()
,但不起作用。
val destId = currentController.currentDestination?.id
if (destId != R.id.wikiFragment && destId != R.id.statisticsFragment && destId != R.id.trackerFragment)
currentController.navigateUp()
和HomeActivity中:
override fun onBackPressed() {
if (vm.currentController.graph.startDestination == vm.currentController.currentDestination?.id) {
super.onBackPressed()
} else {
vm.currentController.popBackStack()
}
}
以及所有来源:https://github.com/SuperCatDev/OverHub/tree/feature/maps
答案 0 :(得分:0)
通过从ViewModel中提取所有NavController来解决此问题,并且从不保留NavController实例。仅在需要访问时使用吸气剂方法。
答案 1 :(得分:0)
好的,我已经研究了这个令人讨厌的错误,并解决了几个小时。 关键是重写onResume!
因此,使一个标志变量像这样
var completePlayed = false
然后像您想做的那样在onSomethingListener上以及在该更改值内部进行旋转
completePlayed = true
然后,覆盖onResume
override fun onResume() {
super.onResume()
if(completePlayed){
navController!!.navigate(R.id.action_chpaterSecondFragment_to_chapterPlayerFragment)
}else{
toast("false")
}
}