Координировать владение кнопкой Назад во вложенных контроллерах навигации - PullRequest
0 голосов
/ 27 августа 2018

У меня есть основной экран, который показывает общую информацию о приложении, и нижний лист с дополнительной информацией.

Содержание основного экрана может измениться, если пользователь щелкнет что-либо в меню ящика навигации, выбрав новый экран.

Нижний лист на главном экране также может меняться, когда пользователь нажимает на дополнительные данные.

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

Моя проблема в том, что при использовании новых компонентов архитектуры Android Navigation Controller есть опция app:defaultNavHost="true", которая перехватывает кнопку возврата.

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

Есть ли способ программного управления app:defaultNavHost, чтобы вложенные Navigation Controllers могли сосуществовать и координировать владение кнопкой возврата?

1 Ответ

0 голосов
/ 28 августа 2018

Одним из исправлений в Navigation 1.0.0-alpha04 является то, что Navigation автоматически устанавливает каждое место назначения фрагмента как основной фрагмент навигации , что гарантирует, что любой дочерний менеджер фрагментов (такой как тот, который используется вложенным графом навигации), автоматически получит нажатие кнопки назад до диспетчера внешних фрагментов.

Это означает, что если вы используете NavHostFragment с app:defaultNavHost="true" в другом NavHostFragment, который также использует app:defaultNavHost="true", он будет работать «из коробки». То же самое применимо, если вы выполняете ручные фрагменты транзакций, которые добавляют в задний стек, используя getChildFragmentManager() в любом Фрагменте, который был создан Navigation.

Как объяснено в , исходная проблема , app:defaultNavHost="true" использует существующие API-интерфейсы фрагментов и может быть программно изменена в любое время с помощью кода, такого как:

// This effectively removes the app:defaultNavHost flag
getSupportFragmentManager().beginTransaction()
    .setPrimaryNavigationFragment(null)
    .commit()
// Pass in your NavHostFragment to re-enable the flag
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...