Фрагментное построение бэкстека с помощью NavDeepLinkBuilder - PullRequest
2 голосов
/ 27 мая 2020

У меня есть одно приложение для занятий с тремя фрагментами: A, B, C. В обычном потоке приложения фрагменты открываются последовательно: A-> B -> C У меня есть служба переднего плана с уведомлением, которое при нажатии открывает фрагмент C. Я использую компонент архитектуры навигации и добавляю пункт назначения к уведомлению как deeplink:

NotificationCompat.Builder(context, NOTIFICATION_CHANNEL)
    ....
    .setContentIntent(NavDeepLinkBuilder(context)
        .setGraph(R.navigation.main_navigation)
        .setDestination(R.id.fragmentC)
        .setArguments(bundle)
        .createPendingIntent())
    .build()

Backstack фрагмента не создается. Когда я возвращаюсь назад от фрагмента C, я сразу перехожу к фрагменту A, а не к B. Согласно Принципам навигации backstack должен быть естественным, но я не могу этого добиться. Что мне здесь не хватает? Спасибо.

Ответы [ 2 ]

0 голосов
/ 28 мая 2020

Я достиг желаемого бэкстэка путем рефакторинга моего навигационного графа во вложенные графы. Как вкратце упоминается в справочнике NavDeepLinkBuilder «Пункт назначения и все его родители будут в заднем стеке.» И «Родительский элемент назначения является начальным пунктом назначения содержащего графа навигации».

Вместе эти два значения означают, что backstack будет состоять из начальных пунктов назначения всех вложенных графов навигации, частью которых является пункт назначения deeplink.

Изначально у меня был один навигационный граф без вложенности, и мой единственный элемент backstack был начальным пунктом назначения этого графа. Когда я реорганизовал навигационный граф, чтобы он состоял из основного (внешнего) навигационного графа и вложенного графа, backstack состоял из начального пункта назначения обоих графов.

0 голосов
/ 27 мая 2020

Для этого вам нужно запустить элемент root (действие или фрагмент, который запустил стек), и он автоматически восстановит все до последнего добавленного фрагмента, но убедитесь, что фрагменты добавлены в backstack.

В случае, если вам потребуется восстановить другой фрагмент, вы можете прослушать это намерение и просто выполнить сброс до требуемой транзакции.

...