嵌套导航时,导航的后堆栈会丢失

时间:2019-05-30 14:24:13

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

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

Frag1 -> Frag2 -> Frag3

Frag2内有一个NavHostFragment,具有自己的导航

InnerFrag1 -> InnerFrag2

如果我这样做

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

然后我会在InnerFrag2内看到Frag2,当我正常按一下时,我会从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时,导航主机中的片段是正确的片段,但是由于内部导航主机的后置堆栈丢失,因此导航向后远离Frag2。我可以以某种方式保留它还是以其他方式解决它?

编辑:实际上,当我从Frag3转到Frag2时,我看到的是InnerFrag1,两者看上去很相似,这就是为什么回到现在回到Frag1

EDIT2:我发现了我的问题,我像这样从Frag2中的代码中夸大了onViewCreated的导航

    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

2 个答案:

答案 0 :(得分:0)

您现在可以处理片段上的admin.auth().listUsers() 。在您的片段中,只需通过onBackPress方法添加即可。

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属性

答案 1 :(得分:0)

仔细研究了一下之后,原来的问题没有多大意义,我将其删除,但它得到了2个投票¯\ _(ツ)_ /¯

我通过在膨胀图形之前添加检查来解决了我的问题,因此NavHostFragment的图形仅在没有图形的情况下才设置。

    try {
        navHostFragment.navController.graph
    } catch (e: IllegalStateException) {
        val inflater = navHostFragment.navController.navInflater
        val graph = inflater.inflate(navigationId)
        navHostFragment.navController.graph = graph
    }

NavController.getGraph不会返回null,而是抛出IllegalStateException,因此检查很奇怪