Обратная навигация после диплинка по компоненту архитектуры навигации

Когда я открываю приложение из deeplink (пользователь щелкает URL-адрес) и нажимаю кнопку «Назад», я ожидаю, что пользователь перейдет к предыдущему фрагменту в моем навигационном графике, но он просто выйдет из приложения.

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

Могу ли я как-то указать желаемый бэкстэк в моем навигационном графике? Или бэкстэк может формироваться автоматически после диплинка? Для более старой версии библиотеки я обнаружил, что после обратного нажатия он должен перейти в корень моего навигационного графика, но этого не происходит.

Я использую навигационную библиотеку из компонентов архитектуры Android (версия 1.0.0-beta01).


comment
У меня та же проблема, мой вариант использования заключается в том, что в некоторых случаях я запускаю метод handleDeeplink из самого приложения, который должен попадать в разные места назначения на основе заданного URL-адреса, но этот метод очищает backstack, когда он переходит в пункт назначения. Как вы упомянули, это изменение, внесенное в новые версии компонента nav. Вы нашли что-нибудь поблизости или связались с командой Google?   -  person Kayvan N    schedule 07.03.2019


Ответы (2)


Я узнал, что здесь происходит, потому что explicit deep links он должен перейти в новый задний стек, который был бы у вашего приложения, если бы пользователь естественным образом перешел к представлению, а не к существующему заднему стеку (существующий стек очищен.

Когда пользователь открывает ваше приложение по явной глубинной ссылке, стек заданий очищается и заменяется местом назначения глубинной ссылки. При вложении графов начальная точка назначения с каждого уровня вложенности, то есть начальная точка назначения от каждого элемента в иерархии, также добавляется в стек. Это означает, что когда пользователь нажимает кнопку «Назад» из места назначения глубинной ссылки, он перемещается вверх по стеку навигации так же, как если бы он вошел в ваше приложение из точки входа.

Для implicit это немного странно. Вы можете заставить его делать то, что делает explicit, но установить Intent.FLAG_ACTIVITY_NEW_TASK, в противном случае кнопки back button и navigation up будут выполнять две разные функции:

  1. back button будет делать то, что вы могли ожидать, он вернется в существующий задний стек ваших приложений и загрузит этот фрагмент.

  2. Однако up button будет clear a back stack и создаст новый, как если бы это был explicit link.

Если флаг не установлен, вы остаетесь в стеке задач предыдущего приложения, в котором сработала неявная глубокая ссылка. В этом случае кнопка «Назад» возвращает вас к предыдущему приложению, а кнопка «Вверх» запускает задачу вашего приложения в иерархическом родительском пункте назначения в вашем навигационном графе.

Источник: Документация по Android.

person MobDev    schedule 30.05.2020
comment
Можете ли вы мне помочь с этим: stackoverflow.com/questions/64687574/, спасибо. - person Sam Chen; 10.11.2020

Как описано здесь, кнопка возврата должна вернуться к предыдущему фрагменту, вы можете установить его вручную в Java следующим образом: button.setOnClickListener(Navigation.createNavigateOnClickListener(R.id.next_fragment, null));

В Котлине так: button.setOnClickListener(Navigation.createNavigateOnClickListener(R.id.next_fragment, null))

Система Android поддерживает задний стек, содержащий последний посещенный пункт назначения. Первое место назначения вашего приложения помещается в стек, когда пользователь открывает приложение. Каждый вызов метода navigate () помещает другое место назначения на вершину стека. И наоборот, нажатие кнопки «Вверх» или «Назад» вызывает методы NavController.navigateUp () и NavController.popBackStack (), соответственно, для удаления верхнего пункта назначения из стека.

Убедитесь, что вы используете NavHostFragment, а не <fragment> в активности фрагмента хостинга.

person Guy Luz    schedule 07.02.2019
comment
Речь идет о глубоких ссылках. - person MobDev; 30.05.2020