提问者:小点点

使用ViewPager2将片段作为页面


我有以下代码(借用了向日葵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()
}

因此,在上面托管viewpager的host fragment controller中,我有以下内容:

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 ...
}

在调试会话期间,我看到FragmentAFragmentBOnCreateView()方法只被调用/调用一次。 因此,当第一次访问fragmenta时,系统调用它的onCreateView()方法。 当我滑动到fragmentB,然后再次返回到fragmentA时,不会调用OnCreateView()。 为甚么会这样呢? 我怎样才能改变它,使它在我输入片段时被调用呢?

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? { ... }

    }

共1个答案

匿名用户

请尝试使用以下代码:

Java版本:

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版本:-

 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
    }
})

当您从一个片段滑动到下一个片段时,您的ViewPager2OnPageChangeCallback将执行,您可以从那里识别当前选择的片段。