当前位置: 首页 > 知识库问答 >
问题:

屏幕旋转后无法弹出Backstack()。Android导航组件

韩朝斑
2023-03-14

我正在使用NavController:Navigation.findNavController(活动,R.id.statistic_host_fragment)。一切都很好,直到我旋转我的设备,然后我无法导航()popBackStack()

在日志中:FragmentNavigator:忽略popBackStack()调用:FragmentManager已保存其状态,而FragmentNavigator:忽略导航()调用:FragmentManager已保存其状态

当我看到谷歌的样本,他们没有任何关于这个问题,有所有的工作良好。所以我不明白这就是问题所在。

此外,当我使用MVVM时,我会在viewModel中保存navController,并在onCreate()之后在viewModel中重新设置控制器。它解决了旋转后的navigate()问题,但我仍然无法popBackStack()。之后,我尝试使用导航。html" target="_blank">setViewNavController(),但它不起作用。

val destId = currentController.currentDestination?.id

    if (destId != R.id.wikiFragment && destId != R.id.statisticsFragment && destId != R.id.trackerFragment)
        currentController.navigateUp()

并在主页活动中:

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个答案

苏星宇
2023-03-14

好的,我已经处理这个恼人的错误几个小时了,并解决了它。该键覆盖了onResume!

这样做一个标志变量

var completePlayed = false 

然后做任何你想做的事情,比如旋转,在某些东西上,在这个改变值的内部,像这样

completePlayed = true

然后,覆盖onResume

 override fun onResume() {
    super.onResume()
    if(completePlayed){
        navController!!.navigate(R.id.action_chpaterSecondFragment_to_chapterPlayerFragment)
    }else{
        toast("false")
    }

}
壤驷宏才
2023-03-14

通过从ViewModel中提取所有NavController并从不保留NavController实例来解决问题。仅在需要访问时使用getter方法。

 类似资料:
  • 在屏幕旋转后,虽然我在super.onCreate(null);,中传递null,但我得到了object返回的nullPointerException异常。我知道在传递savedInstanceState=null的同时必须销毁并重新创建活动,这意味着活动应该在旋转后开始,因为它是第一次开始,为什么在旋转后会出现此异常? onCreate()代码段,其中名为historyText的对象 Logca

  • 问题内容: 我有4页。 从第1页>第2页>第3页>第4页。 用户到达page_3并单击按钮后,它将导航到page_4。单击该按钮后,我想清除所有导航历史记录,以便当用户返回page_4时,该应用程序退出而不是返回至page_3。 我试过了: 但是什么也没发生。我仍然可以返回page_3,page_2等。如何做到这一点,以便当用户单击page_3上的按钮时,他可以转到page_4,而从page_4不

  • 我在使用和arch组件时遇到了一个问题。当使用并旋转屏幕时,观察者会被触发... 我试图在所有片段生命周期方法中移动,但没有成功。 我的场景相对简单: null 提前感谢!

  • 我想在模拟器上测试手机的旋转,我看到我们必须使用CtrlF11的所有地方,但它只旋转模拟器的图像,不会启动配置更改事件或重新绘制活动。 下面是我用CtrlF11得到的: 那么,我必须用什么来模拟真实的旋转呢?

  • 我有一个应用程序小部件,当它更新时,获取具有与小部件匹配的维度的图像,并将该图像放入(通过)。它工作得很好。 但是对于支持主屏幕旋转的设备(我不是说基于设备方向的

  • 实现在竖屏的NavigationController中push一个横屏的UIViewController,模拟器测试兼容5.0、6.0系统。实现程序中手动旋转屏幕的效果。 [Code4App.com]