Search code examples
androidkotlinandroid-architecture-navigationandroid-viewpager2

Navigate from Android ViewPager2 child fragment to another fragment


Is there a way to navigate from a child fragment of ViewPager2 to another fragment? Let's say I have a parent fragment [ParentFragment] containing only a ViewPager2 and a TabLayout. I have 2 children fragments [ChildrenFragment1 and ChildrenFragment2] created with FragmentStateAdapter. I want to navigate from ChildrenFragment2 to another FragmentB so that when i navigate back from FragmentB, to show position of the ParentFragment to ChildFragment2?

ex: ChildFragment1 -> ChildFragment2 -> FragmentB -> ChildFragment2

I get:

java.lang.IllegalArgumentException: Navigation action/destination id:actionChildFragment2_to_FragmentB cannot be found from the current destination

Solution

  • I found a solution, i keep the current page in a ViewModel LiveData property, setting it on page change inside the ParentFragment:

    binding.viewPager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
            override fun onPageSelected(page: Int) {
                viewModel.updatePageSelected(page)
            }
        })
    

    and observe the page change inside the ParentFragment:

    subscribeToLiveData(viewModel.viewPagerSelected) { page ->
            binding.viewPager.setCurrentItem(page, false)
        }
    

    The ParentViewModel:

    private val _viewPagerSelected = MutableLiveData<Int>()
    val viewPagerSelected: LiveData<Int> = _viewPagerSelected
    
    fun updatePageSelected(newSelection: Int) {
        _viewPagerSelected.value = newSelection
    }