当前位置: 首页 > 知识库问答 >
问题:

使用ViewPager2将片段作为页面

何聪
2023-03-14

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

莘昊
2023-03-14

请尝试使用以下代码:

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将执行,您可以从那里识别当前选择的片段。

 类似资料:
  • 我有一个简单的方法,我想把片段名作为参数传递。我几乎没有像这样的碎片 1) AddNewDatesFragment 2) AskFragment 3)免责声明片段 我有下面的代码可以正常工作 我想在方法中编写一些代码,在这里我可以调用这样的方法 等 我曾经尝试过这样的代码,但在if条件下不工作会导致编译时错误。 我对实施这种方法感到好奇。谢谢

  • 我有一个带有底部导航视图的活动,其中有3个相关片段。其中之一是带有ViewPager2的片段,ViewPager2使用FragmentStateAdapter。在适配器的createfragment(int position)方法中,我返回另一个片段的两个实例,该片段有一个选项菜单,在它的onCreate()中,我调用setHasOptionsMenu(true)。问题是,在适配器初始化时,所有片

  • 我被告知使用FragmentStateAdapter的createFranie覆盖来按索引获取当前片段。 这就是我的适配器的外观。 在我们在此活动/片段上强制使用onSaveInstance/OnRestoreInstance之前,这一切正常。 ViewPager2重新加载已经存在的片段,我们需要一种访问方法。FragmentStateAdapter类中的以下LOC证明了这一点 在活动/片段重新创

  • 问题内容: 无论我在哪里看,似乎都可以用作。为什么总是看到? 问题答案: 您基本上可以使用,或者仍然可以使用,但是您的问题的答案在的文档中: FrameLayout旨在遮挡屏幕上的某个区域以显示单个项目。通常,应使用FrameLayout来保存单个子视图,因为在子视图彼此不重叠的情况下,难以以可扩展到不同屏幕尺寸的方式组织子视图。不过,您可以使用android:layout_gravity属性将多

  • 我正在尝试在我的应用程序的三个主屏幕(提要、论坛)之间实现一个简单的滑动操作 在我的情况下,片段并不是同一类的所有实例,而是完全不同的。 M 问题存在于片段页面适配器中。我不确定如何返回 getItem 方法中的每个片段。 我已经尝试了以下内容,但它除了作为有效的返回语句之外没有,并且仍然期待一个: 这是我的一个片段的例子: 这是我的主要活动: 我还尝试定义一个变量电流片段,为每个当语句重新分配它

  • 我有方法: 将图像添加到我的recyclerview。如果它在活动中,我会在OnCreate中调用initImageBitmaps()。不幸的是,我必须在片段中使用它,问题是:如何将这些方法实现到扩展片段的类?当然,所有内容都将显示在RecyclerView中,并带有xml中的recycler\u视图id。 编辑:我的适配器: 它仅在注释mContext=context时编译 在适配器中。那么错误

  • 我在一个滚动视图中得到了一个ViewPager2小部件,我想将其设置为类似于当前显示片段的内容的高度。片段包含一个网格视图或一个列表视图,其高度设置为wrap_content。 问题是,在创建片段视图后,网格视图会被内容填充,因此视图寻呼机的子高度为“0”。此外,每个片段的高度也可能与其他片段不同。 如果我将gridview高度设置为例如500dp,一切正常。 是否有某种监听器来检测gridvie