Android Jetpack Navigation вложенная вкладка обратная навигация странное поведение

Итак, я пробую компонент навигации Jetpack с BottomNavigationView. Я создал два слоя BottomNavigationView, и структура выглядит так:

  • MainActivity (with nav_host_fragment, navigation_graph, bottom_navigation)
    • FragmentA
    • ФрагментB
    • FragmentC (with nested_nav_host_fragment, nested_navigation_graph, nested_bottom_navigation)
      • FragmentCA
      • FragmentCB
      • FragmentCC

У меня нет проблем с перемещением вперед, но я не мог перемещаться назад должным образом. Например, когда я перехожу из A -> B -> C, а в C перехожу к CA -> CB -> CC, затем нажимая кнопку «Назад» или вызывая navControler обратно, он должен перейти от CC -> CB -> CA -> B -> A, но вместо этого он сразу перешел к A.

Минимальный демонстрационный проект можно найти здесь, надеюсь, кто-то может помочь, спасибо.


person Joshua Lin    schedule 12.07.2018    source источник


Ответы (1)


По умолчанию фрагменты не выталкивают ничего, добавляемого в задний стек дочерних фрагментов.

Чтобы кнопка возврата системы отображала дочерние фрагменты фрагмента C, необходимо специально выбрать такое поведение, вызвав setPrimaryNavigationFragment ().

Это можно сделать в любом месте вашего фрагмента после прикрепления фрагмента. Например, вы можете обновить свой FragmentC, чтобы сделать это в onActivityCreated():

override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)
    NavigationUI.setupWithNavController(nested_bottom_navigation,
            activity?.findNavController(R.id.nested_nav_host_fragment)?:return)

    // This routes the system back button to this Fragment
    requireFragmentManager().beginTransaction()
            .setPrimaryNavigationFragment(this)
            .commit()
}

Фактически это та же самая техника, которую использует атрибут app:defaultNavHost="true" на NavHostFragment.

person ianhanniballake    schedule 12.07.2018
comment
Привет, спасибо за быстрый ответ! Итак, setPrimaryNavigationFragment () действительно помогла, теперь последовательность всплывающих окон стала CC - ›CA -› A, это ожидаемое поведение BottomNavigationView? Потому что я хочу добиться CC- ›CB-› CA- ›B-› A, какие-нибудь предложения? И если setPrimaryNavigationFragmet () совпадает с app: defaultNavHost = true, почему он не сработал, как я установил его в моем fragment_c.xml? - person Joshua Lin; 16.07.2018
comment
Да, этот задний стек ожидается (нижняя навигация всегда возвращается через startDestination графика, но не проходит через промежуточные элементы). defaultNavHost на вашем внешнем NavHostFragment делает его основным с FragmentManager активности, а defaultNavHost на вашем внутреннем NavHostFragment делает его основным в диспетчере дочерних фрагментов вашего фрагмента, но в нем отсутствует диспетчер фрагментов NavHostFragment (т. Е. FragmentManager находится в каждом месте назначения), поэтому вам нужно чтобы вручную установить его на этот промежуточный уровень. - person ianhanniballake; 16.07.2018
comment
FWIW, этот вопрос отмечает, что Navigation автоматически вызовет setPrimaryNavigationFragment, как только выйдет alpha04. - person ianhanniballake; 16.07.2018