`onDetach` не работает внутри фрагмента viewpager2

Мне было интересно, можно ли detach просмотреть фрагмент пейджера 2 вручную, потому что я не смог вызвать onDetach, что привело к некоторым сбоям (поскольку он может работать в фоновом режиме) во фрагменте viewPagers.

//ViewPagerPage1.kt
override fun onDetach(){
   super.onDetach()
   Log.d("TAG", "VP fragment Detached")//doesn't show up

Я пробовал такие вещи, как:

//Main.kt
override fun onDetach(){
   super.onDetach()
    //Parent fragement where viewPager implement
    viewPager.removeAllViews()//no luck
}

или внутри Coroutine:

//Main.kt
val job = CoroutineScope(Main).launch {
   view.apply {
            val listOfFragment = arrayListOf<Fragment>(
                ...
            )
            val adapter = TabsPagerAdapter(
                listOfFragment,
                requireActivity().supportFragmentManager,
                requireActivity(),
                lifecycle

            )
            adapter

            viewPager1.adapter = adapter
            val tabNames = listOf<String>(
               ...
            )
            TabLayoutMediator(tabLayout, viewPager) { tab, p ->
                viewPager.setCurrentItem(tab.position, true)
                tab.text = tabNames[p]

            }.attach()
        }

}
//Main.kt
override fun onDetach(){
  super.onDetach()
  job.cancel()
}

но эти вещи не работают, я также пытался добавить журнал в оба фрагмента (просмотреть родительский и дочерний пейджер)

//ViewPagerPage1.kt
override fun onDetach(){
   super.onDetach()
   Log.d("TAG", "VP fragment Detached")
}
//Main.kt
override fun onDetach(){
   super.onDetach()
   Log.d("TAG", "fragment Detached")
}

в результате при нажатии "назад" отображается только TAG: fragment Detached Примечание Main.kt — это фрагмент, содержащий ViewPagerPage1

если вам нужен адаптер:

class TabsPagerAdapter(val array: ArrayList<Fragment>,
                       val manager: FragmentManager,
                       val context: Context,
                       val lifecycle: Lifecycle): FragmentStateAdapter(manager, lifecycle){
    override fun createFragment(position: Int): Fragment {
        return array[position]
    }

    override fun getItemCount(): Int {
        return array.size
    }
}


person Ananiya Jemberu    schedule 14.05.2021    source источник
comment
Не понятно, чего вы пытаетесь добиться. onDetach — это метод обратного вызова жизненного цикла фрагментов. Вы не должны называть это самостоятельно. Он будет запущен, когда фрагмент будет отсоединен.   -  person Eugene Troyanskii    schedule 24.05.2021
comment
Если вы хотите динамически добавлять страницы, вы можете сначала изменить источник данных, а затем вызвать notifyDataSetChanged() на ViewPager2 или проверить это: stackoverflow.com/questions/61736940/.   -  person Sam Chen    schedule 24.05.2021
comment
Почему вы хотите сделать это вручную? и см. это, чтобы получить информацию о жизненном цикле фрагмента.   -  person danial iranpour    schedule 31.05.2021
comment
Что ж, запрос внутри фрагмента viewPager, например, viewmodel, не остановит даже родительский фрагмент (контейнер viewpager), отсоединенный, что приводит к некоторым сбоям.   -  person Ananiya Jemberu    schedule 31.05.2021


Ответы (1)


Просмотр пейджера не может быть отсоединен из-за утечки памяти. Чтобы избежать этого, измените код для создания экземпляра TabsPagerAdapter в соответствии со следующим кодом.

val adapter = TabsPagerAdapter(
            listOfFragment,
            childFragmentManager, 
            requireActivity(),
            viewLifecycleOwner.lifecycle)

Примечание:

  • requestActivity().supportFragmentManager -> childFragmentManger : Все его дочерние элементы должны управляться сами по себе, а не в деятельности.

  • lifecycle -> viewLifecycleOwner.lifecycle : Фрагмент имеет 2 жизненных цикла, один для представления (viewLifecycleOwner.lifecycle), один для себя (жизненный цикл). В данном случае адаптер — это представление, поэтому нам просто нужно использовать жизненный цикл представления (viewLifecycleOwner.lifecycle).

person Duc Thang    schedule 31.05.2021