Навигация по Android Jetpack с помощью ViewPager и TabLayout - PullRequest
0 голосов
/ 27 сентября 2018

Для нового приложения я использую навигационную библиотеку Jetpack для правильной обратной навигации.Первый уровень навигации - это навигационный ящик, который отлично работает с навигацией Jetpack, как описано в документации.Но есть другой уровень навигации, реализованный с помощью ViewPager и TabLayout.Фрагменты, переключаемые с помощью TabLayout, содержат дополнительную линейную навигационную иерархию.Однако, по-видимому, не поддерживается ViewPager / TabLayout в Jetpack Navigation.Должен быть реализован FragmentPagerAdapter, и управляемый задний стек заканчивается при переключении вкладок.Существует разрыв между навигацией верхнего уровня и навигацией внутри каждой вкладки.Есть ли способ заставить это работать с Jetpack Navigation?

Ответы [ 3 ]

0 голосов
/ 05 февраля 2019

Да , но вам придется реализовать свой собственный пункт назначения, реализовав класс Navigator и переопределив хотя бы методы popBackStack()и navigate().

В вашем navigate вам нужно будет вызвать ViewPager.setCurrentTab() и добавить его в свой стек.Что-то вроде:

lateinit var viewPager: ViewPager? = null // you have to provide this in the constructor

private val backstack: Deque<Pair<Int, View>> = ArrayDeque

override fun navigate(destination: Destination, args: Bundle?,
                      navOptions: NavOptions?, navigatorExtras: Extras?
): NavDestination? {

    viewPager.currentItem = destination.id
    backstack.remove(destination.id) // remove so the stack has never two of the same
    backstack.addLast(destination.id)

    return destination
}

В вашем popBackStack вам придется вернуть последний выбранный элемент.Что-то вроде:

override fun popBackStack(): Boolean {
    if(backstack.size() <= 1) return false

    viewPager.currentItem = backstack.peekLast()
    backstack.removeLast()

    return true
}

Краткое объяснение можно найти в Документах Android и в этом примере пользовательского навигатора для FragmentDialog.

После реализации вашего ViewPagerNavigator вам нужно будет добавить его к вашему NavController и установить для слушателей выбора представлений вкладок вызов NavController.navigate().

Я надеюсь, что кто-то реализует библиотеку для всех этих распространенных шаблонов.(ViewPager, ViewGroup, FragmentDialog), если кто-нибудь найдет его, поместите его в комментарии.

0 голосов
/ 18 марта 2019

Экспериментировал с различными подходами для обработки TabLayout с Jetpack Navigation .Но столкнулись с такими проблемами, как наличие полной истории переключения между вкладками несколько раз и т. Д.

Просматривая известные проблемы Google Android, прежде чем подавать запрос на демонстрацию, я обнаружил эту существующую проблему .

Его статус Закрыт помечен как Предполагаемое поведение со следующим объяснением:

Навигация фокусируется на элементах, которые влияют на задний стек, а вкладки невлияет на задний стек - вы должны продолжать управлять вкладками с ViewPager и TabLayout - Ссылаясь на Обучение на Youtube .

0 голосов
/ 11 декабря 2018

Что до сих пор работало для меня:

In navigation_graph.xml

  • сделать ваш ViewPagerFragment корнем вложенного графа
  • подключить вашу входящую и выходящую навигациюк вложенному графику

во вложенном графике:

  • добавьте дочерние фрагменты ViewPager к вложенному графику

Мне не нужно было изменятьViewPager и Directions были созданы для дочерних фрагментов, поэтому навигация возможна оттуда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...