Skip to content

Snappy1

  • Home
  • Android
  • What
  • How
  • Is
  • Can
  • Does
  • Do
  • Why
  • Are
  • Who
  • Toggle search form

[FIXED] android – Fragments as Pages with ViewPager2

Posted on November 11, 2022 By

Solution 1 :

Please try to use the below code:

Java Version:

viewPager.addOnPageChangeListener(new OnPageChangeListener() {
    public void onPageScrollStateChanged(int state) {}
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}

    public void onPageSelected(int position) {
        // put your code here
    }
});

Kotlin Version:-

 viewPager.registerOnPageChangeCallback(object : 
 ViewPager2.OnPageChangeCallback() {
    override fun onPageScrollStateChanged(state: Int) {
        println(state)
    }

    override fun onPageScrolled(
        position: Int,
        positionOffset: Float,
        positionOffsetPixels: Int
    ) {
        super.onPageScrolled(position, positionOffset, positionOffsetPixels)
        println(position)
    }


    override fun onPageSelected(position: Int) {
        super.onPageSelected(position)
        // put your code here
    }
})

When you swipe from one fragment to next, your viewPager2 OnPageChangeCallback will execute and you can identify the currently selected fragment from there.

Problem :

I have the following code (borrowed from the sunflower app) :

const val FRAGMENT_A_PAGE_INDEX = 0
const val FRAGMENT_B_PAGE_INDEX = 1

class ViewPagerAdapter(fragment: Fragment): FragmentStateAdapter(fragment) {

    /**
     * Mapping of the ViewPager page indexes to their respective Fragments
     * */
    private val tabFragmentsCreators: Map<Int, () -> Fragment> = mapOf(
        FRAGMENT_A_PAGE_INDEX to { FragmentA() },
        FRAGMENT_B_PAGE_INDEX to { FragmentB() }
    )

    override fun getItemCount(): Int = tabFragmentsCreators.size

    override fun createFragment(position: Int): Fragment =
        tabFragmentsCreators[position]?.invoke() ?: throw IndexOutOfBoundsException()
}

So, in my host fragment controller hosting the viewpager above, I have the following:

class ViewPagerControllerFragment : Fragment() { 

     override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
         binding = FragmentViewPagerControllerBinding.inflate(inflater, container, false)

         // set the adapter of the ViewPager2 widget
         binding.viewpager.adapter = ViewPagerAdapter(this)

         binding.lifecycleOwner = viewLifecycleOwner
         // inflate the layout for this fragment
         return binding.root
     }
     ... // NOT RELEVANT PARTS ARE SKIPPED ...
}

During a debug session, I saw that onCreateView() methods of FragmentA and FragmentB gets only called/invoked once.
So, when FragmentA is visited the first time, the system invokes onCreateView() method of it. When I swipe to FragmentB and then back to FragmentA again, the onCreateView() is not invoked.
Why is that so ? And how can I can change this so that it is invoked whenever I enter the Fragment?

class FragmentA : Fragment() {

    // gets called once
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { ... }

}

class FragmentB : Fragment() {

        // gets called once
        override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { ... }

    }

Comments

Comment posted by Shalu T D

on create view() will be called only once. what you want to do in onCreateView() ?

READ  [FIXED] android - How do I save files to device storage when the app is installed?
Powered by Inline Related Posts

Comment posted by ebeninki

there is some code that should be run when we swipe to the Fragment. Should I put that code to onResume() when onCreateView() only called once ?

Android Tags:android, android-fragments, android-viewpager2

Post navigation

Previous Post: [FIXED] java – android studio 4.0 cannot load jdk class
Next Post: [FIXED] java – How can ViewParent be cast into View?

Related Posts

[FIXED] kotlin – Android worker – update and preserve state across retries Android
[FIXED] By clicking android widget invoke some functions that are present in MainActivity Android
[FIXED] android – How to make an app’s view update automatically when a row’s column variable is changed in MySQL Android
[FIXED] React-Native Native UI component doen’t resize (Android) Android
[FIXED] android – Width change of a view is not reflected in UI even though view.isInLayout is true Android
[FIXED] android – Exoplayer threading errors NoSuchElementExceptionat java.util.ArrayDeque.removeFirst Android

Archives

  • April 2023
  • March 2023
  • February 2023
  • January 2023
  • December 2022
  • November 2022
  • October 2022
  • September 2022

Categories

  • ¿Cómo
  • ¿Cuál
  • ¿Cuándo
  • ¿Cuántas
  • ¿Cuánto
  • ¿Qué
  • Android
  • Are
  • At
  • C'est
  • Can
  • Comment
  • Did
  • Do
  • Does
  • Est-ce
  • Est-il
  • For
  • Has
  • Hat
  • How
  • In
  • Is
  • Ist
  • Kann
  • Où
  • Pourquoi
  • Quand
  • Quel
  • Quelle
  • Quelles
  • Quels
  • Qui
  • Should
  • Sind
  • Sollte
  • Uncategorized
  • Wann
  • Warum
  • Was
  • Welche
  • Welchen
  • Welcher
  • Welches
  • Were
  • What
  • What's
  • When
  • Where
  • Which
  • Who
  • Who's
  • Why
  • Wie
  • Will
  • Wird
  • Wo
  • Woher
  • you can create a selvedge edge: You can make the edges of garter stitch more smooth by slipping the first stitch of every row.2022-02-04
  • you really only need to know two patterns: garter stitch

Recent Posts

  • Can Vicks humidifier be used without filter?
  • What color is Spanish green?
  • How old is Jamie in The War That Saved My Life?
  • When should I use scalp massager for hair growth?
  • Can I put polyurethane over liming wax?

Recent Comments

No comments to show.

Copyright © 2023 Snappy1.

Powered by PressBook Grid Dark theme