首页 > 解决方案 > ViewPager 在使用前激活它的片段

问题描述

我正在使用 ViewPager 作为选项卡在不同的片段之间滑动。我注意到,仅通过创建适配器,每个片段中的 onCreateView 函数就会立即被调用,这并不好,因为我想在特定的给定时间运行这些函数中的代码。

我在 MainActivity 中的代码:

private var profileTab: TabLayout.Tab? = null
    private var swipeTab: TabLayout.Tab? = null
    private var matchesTab: TabLayout.Tab? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        profileTab = navigationTabs.newTab()
        swipeTab = navigationTabs.newTab()
        matchesTab = navigationTabs.newTab()

        navigationTabs.addTab(profileTab!!)
        navigationTabs.addTab(swipeTab!!)
        navigationTabs.addTab(matchesTab!!)

        val adapter = PagerAdapter(supportFragmentManager, navigationTabs.tabCount)
        fragmentContainer.adapter = adapter

我的 PagerAdapter.kt 代码:

class PagerAdapter (fm: FragmentManager, private val mNoOfTabs: Int) : FragmentStatePagerAdapter(fm, mNoOfTabs) {

    override fun getItem(position: Int): Fragment {
        when (position) {
            0 -> {
                return ProfileFragment()
            }
            1 -> {
                return SwipeFragment()
            }
            2 -> {
                return MatchesFragment()
            }
        }
        return null!!
    }

    override fun getCount() = mNoOfTabs
}

在 activity_main.xml 中(如果重要的话):

    <com.google.android.material.tabs.TabLayout
        android:id="@+id/navigationTabs"
        android:layout_width="match_parent"
        android:layout_height="@dimen/navigation_height"
        android:background="@drawable/navigation_shadow"
        app:layout_constraintTop_toTopOf="parent"
        app:tabIndicator="@null"
        app:tabMinWidth="@dimen/navigation_height"
        app:tabRippleColor="@null" />

<!--    // the fragment will be displayed here:-->
    <androidx.viewpager.widget.ViewPager
        android:id="@+id/fragmentContainer"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="100dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/navigationTabs"/>

这是默认行为吗?可以防止它,使碎片不会立即启动吗?

标签: androidkotlinandroid-viewpager

解决方案


ViewPager 将至少初始化两个片段。ViewPager 允许我们设置setOffscreenPageLimit(),但它至少需要 1,因此它将初始化第一个和下一个片段。在这里阅读更多ViewPager.setOffscreenPageLimit(0) 不能按预期工作

尝试通过onPageChangedListener()在 MainActivity 中设置来调用 Fragment 中的代码,以便在用户滑动/打开 Fragment 时执行代码。


推荐阅读