屏幕旋转后无法popBackStack()。 Android导航组件

时间:2019-03-06 07:44:18

标签: android android-architecture-navigation

我正在使用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

2 个答案:

答案 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")
    }

}