android - 嵌套导航时,导航的返回堆栈丢失

标签 android android-fragments kotlin android-architecture-navigation

我有一个看起来像这样的导航

Frag1 -> Frag2 -> Frag3

Frag2 里面有一个 NavHostFragment 有自己的导航

InnerFrag1 -> InnerFrag2

如果我这样做

  1. 导航到 Frag2
  2. 导航到 Frag2 内的 InnerFrag2
  3. 导航到 Frag3
  4. 回去

然后我会在 Frag2 中看到 InnerFrag2,当我正常按回时,我会从 InnerFrag2 转到 InnerFrag1Frag2 中,但现在它将改为 Frag1

这是我在 Frag2 中的导航处理


    private val backPressedCallback = OnBackPressedCallback {
        navHostFragment.navController.navigateUp()
    }


    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        requireActivity().addOnBackPressedCallback(backPressedCallback)
    }

    override fun onDestroyView() {
        activity?.removeOnBackPressedCallback(backPressedCallback)
        super.onDestroyView()
    }

    private val navHostFragment: NavHostFragment
        get() = childFragmentManager.findFragmentById(R.id.innerNavHostFragment) as NavHostFragment

当返回到 Frag2 时,导航主机中的 fragment 是正确的,但向后导航会远离 Frag2,因为内部导航主机的返回堆栈丢失。我能否以某种方式坚持它或以其他方式修复它?

编辑: 实际上,当从 Frag3Frag2 时,我在里面看到了 InnerFrag1,两者看起来很像,这就是为什么现在回过头来让我回到 Frag1

EDIT2:我发现了我的问题,我从 onViewCreated 中的代码中膨胀了 Frag2 的导航

    val navHostFragment = (frag2NavHostFragment as? NavHostFragment) ?: return
    val inflater = navHostFragment.navController.navInflater
    val graph = inflater.inflate(navigationId)
    navHostFragment.navController.graph = graph

在 xml 中设置它使其工作,我仍然需要以某种方式从代码中设置它,Frag2 根据其参数选择要使用的导航

现在我的问题从 Navigation's back stack is lost 变为 How to preserve NavHostFragment's state when settings it's graph from code

最佳答案

您现在可以在 fragment 上处理 onBackPress。在您的 fragment 中,只需将其添加到 onViewCreated 方法中即可。

val navController = Navigation.findNavController(view)
        requireActivity().onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
            override fun handleOnBackPressed() {
                navController.popBackStack(R.id.fragmentWhereYouWantToGo, false)
            }
        })

我还会检查 app:popUpToapp:popUpToInclusivesingleTop XML 属性到您的 中的 fragment fragment 2

关于android - 嵌套导航时,导航的返回堆栈丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56380154/

相关文章:

java - 使用底部导航栏

android - 如何使用 addView 将 View 添加到布局?

android - 是否有与 Widget.Material.Spinner.Underlined 等效的 AppCompat?

android - 模拟器不给出错误,但设备在 putExtra() 上给出 java.lang.NullPointerException

reflection - 如何获得Any类(class)? Kotlin中的变量?

android - 未解析的引用 : DrawImage

android - 如何在 Kotlin 中使用 Realm 的 in 方法

android - 如何对齐抽屉导航菜单中的开关?

Android - 如何从命令行在模拟器上运行本地应用程序?

java - Android:从 Fragment 调用父 Activity