Фрагменты Android ViewPager не уничтожаются при выходе из экрана - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть фрагменты, которые управляются внутри ViewPager и работают довольно хорошо.Он использует FragmentStatePagerAdapter для управления фрагментами, и все они принадлежат к одному и тому же типу.

Этот ViewPager работает внутри родительского фрагмента .Однако, когда пользователь нажимает кнопку «Назад», чтобы оставить родительский фрагмент, фрагменты, которые внутри ViewPager не перейдут в Pause-> Destroy-> onDetach и т. Д.

Кажется, что они остаются в своем состоянии onResume дажекогда они больше не видны, хотя родительский фрагмент, который создал PagerAdapter, был уничтожен и отсоединен должным образом.

Представьте, что когда пользователь, кажется, уже находится в другом экране, тогда, когда он нажимает кнопку «Домой», я вижу, что фрагменты, которые были в ViewPager (которые больше не видны), переходят в состояние паузы, икогда пользователь возвращается к приложению, я вижу, что фрагменты, которые были в ViewPager, возобновились, когда они не видны.

Есть ли какое-либо объяснение для такого поведения?

Здесь частьмой код, который инициализирует PagerAdapter в родительском фрагменте:

private fun configureScreen() {
    tabs_view_pager.offscreenPageLimit = TabsPagerAdapter.NUM_PAGES - 1

    fragmentManager?.let {
        tabsPagerAdapter = TabsPagerAdapter(it)
        tabs_view_pager.adapter = tabsPagerAdapter
    }
}

А вот часть кода PagerAdapter:

class TabsPagerAdapter(fm : FragmentManager) : FragmentStatePagerAdapter(fm) {

    companion object {
        const val NUM_PAGES = 3
        private var pagesTitle = arrayOf("" , "", "")
    }


    override fun getItem(item: Int): Fragment {
        return ChildFragment.newInstance()
    }

    override fun getCount(): Int {
        return NUM_PAGES
    }

    fun updateChildFragments(someData: FragmentData?) {
            //process new data
            notifyDataSetChanged()
       }
    }

    override fun getItemPosition(fragment: Any): Int {
        (fragment as ChildFragment).refresh()
        return PagerAdapter.POSITION_UNCHANGED
    }
}

1 Ответ

0 голосов
/ 29 ноября 2018

При использовании viewPager с фрагментами внутри другого фрагмента вы должны вызывать getChildFragmentManager() вместо getFragmentManager().

...