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

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

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

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

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

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

Kayvan N 06.03.2019 22:33
12
1
4 067
2

Ответы 2

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

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

The Android system maintains a back stack containing the last visited destination. The first destination of your app is placed on the stack when the user opens the app. Each call to the navigate() method puts another destination on the top of the stack. Conversely, pressing the Up or Back button calls the NavController.navigateUp() and NavController.popBackStack() methods, respectively, to pop the top destination off of the stack.

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

Вопрос о глубоких ссылках.

MobDev 30.05.2020 19:43

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

When a user opens your app via an explicit deep link, the task back stack is cleared and replaced with the deep link destination. When nesting graphs, the start destination from each level of nesting—that is, the start destination from each element in the hierarchy—is also added to the stack. This means that when a user presses the Back button from a deep link destination, they navigate back up the navigation stack just as though they entered your app from its entry point.

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

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

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

If the flag is not set, you remain on the task stack of the previous app where the implicit deep link was triggered. In this case, the Back button takes you back to the previous app, while the Up button starts your app's task on the hierarchical parent destination within your navigation graph.kquote

Источник: Android-документация

Не могли бы вы помочь мне с этим: stackoverflow.com/questions/64687574/…, спасибо.

Sam Chen 10.11.2020 05:57

Другие вопросы по теме