ViewPager 在使用前激活它的片段

ViewPager activates its fragments before usage

我正在使用 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"/>

这是默认行为吗?能不能阻止,让碎片不会马上启动?

ViewPager 将最少初始化两个片段。 ViewPager 允许我们设置 setOffscreenPageLimit(),但它至少需要 1,所以它会初始化第一个和下一个片段。 在这里阅读更多 ViewPager.setOffscreenPageLimit(0) doesn't work as expected

尝试通过在MainActivity中设置onPageChangedListener()来调用fragments中的代码,这样就可以在用户swiped/opened fragment时执行代码。

Android 中的 ViewPager 默认情况下,加载当前片段的另外 2 个片段。这是一个前一个片段和一个下一个片段以实现流畅的动画。而且您无法更改此默认功能。

实现你想要的一个技巧是使用片段的setUserVisibleHint方法。只要片段可见,就会调用它。但是我不推荐你使用这个方法