Group Group Group Group Group Group Group Group Group

ViewPager2 in Android: Getting Started |

In this tutorial for Android, you’ll learn to use the new ViewPager2 widget. Along the way you will build an app to show celebrity doppelganger animals.

This is a companion discussion topic for the original entry at

In article, after completing TODO3 & running app; my questions:

  1. How does layout of widget.ViewPager2 (main_activity.xml) get inflated or get activated? (once we removed the add Fragment from MainActivity).
  2. You explained under the hood about FragmentStateHandler but were vague about it’s relationship to ViewPager2 (I’m thinking back to the widget declaration in #1 above). How/where do those two get associated?
  3. In DoppelgangerFragment.kt, re: the companion object. It seems unnecessary, that it would be clearer for the properties to be associated with the fragment instance, say in an init {}.
    class DoppelgangerFragment: Fragment (val position: Int) {
    init {
    val bundle = Bundle()
    bundle.putInt( ARG_POSITION, position)
    this.arguments = bundle
    (I’m from the Ruby world, forgive my naivety!)
  4. why is the bundle.putInt / arguments even necessary if you have that information in an instance property? won’t that always be there when the fragment is invoked?

One final question re TabLayoutMediator. You say “if you look at the constructor of TabLayoutMediator, you’ll understand what’s happening in the code.” Umm, actually I don’t. Specifically, for the third parameter [TabConfigurationStrategy tabConfigurationStrategy] which is an interface, I don’t see how you can tell that you are able to pass a lambda (question 1), and that the lambda doesn’t have to deal with fun onConfigureTab(tab: TabLayout.Tab, position: Int) in the lambda (question 2).
The lambda given was:
{ tab, position -> tab.text = doppelgangerNamesArray[position].split(" ")[0] }