Да , но вам придется реализовать свой собственный пункт назначения, реализовав класс 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), если кто-нибудь найдет его, поместите его в комментарии.