ViewPager активирует свои фрагменты перед использованием - PullRequest
0 голосов
/ 23 декабря 2019

Я использую 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"/>

Этоповедение по умолчанию? Можно ли это предотвратить, чтобы фрагменты не были инициированы немедленно?

Ответы [ 2 ]

1 голос
/ 23 декабря 2019

ViewPager в Android по умолчанию, загружает еще 2 фрагмента с текущим фрагментом. Это один предыдущий фрагмент и один следующий фрагмент для плавной анимации. И вы не можете изменить эту функциональность по умолчанию.

Один способ взломать, чтобы достичь того, что вы хотите, это использовать setUserVisibleHint метод фрагмента. это вызывается всякий раз, когда фрагменты становятся видимыми. Но я не рекомендую вам использовать этот метод

1 голос
/ 23 декабря 2019

ViewPager инициализирует два фрагмента минимально. ViewPager позволяет нам установить setOffscreenPageLimit(), но для этого требуется как минимум 1, поэтому он будет инициализировать первый и следующий фрагмент. Подробнее здесь ViewPager.setOffscreenPageLimit (0) не работает должным образом

Попробуйте вызвать код во фрагментах, установив onPageChangedListener() в MainActivity, чтобы вы могли выполнять код, когда пользователь проводил /открытый фрагмент.

...