У меня есть навигация, которая выглядит следующим образом
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
фрагмент в хосте nav является правильным, но навигация назад отходит от Frag2
, потому что внутренняяЗадний стек хоста nav потерян.Могу ли я как-то это сохранить или исправить другим способом?
РЕДАКТИРОВАТЬ: на самом деле при переходе от Frag3
к Frag2
Я вижу InnerFrag1
внутри, оба выглядят одинаково, этопочему возвращение в этот момент возвращает меня к Frag1
EDIT2: Я нашел свою проблему, я надуваю Frag2
s навигацию из кода в 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