我有一个看起来像这样的导航
Frag1 -> Frag2 -> Frag3
在Frag2
内有一个NavHostFragment
,具有自己的导航
InnerFrag1 -> InnerFrag2
如果我这样做
Frag2
InnerFrag2
内部的Frag2
Frag3
然后我会在InnerFrag2
内看到Frag2
,当我正常按一下时,我会从InnerFrag2
内的InnerFrag1
到Frag2
,但是现在改为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
答案 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:popUpTo
,app:popUpToInclusive
或singleTop
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
,因此检查很奇怪