0

Have one activity app, where I have HomeFragment from which I open HostFragment, and HostFragment has ViewPager2 with 3 fragment items TabFragment1, TabFragment2 and TabFragment3.

When I open the HostFragment, and then go back, my tabFragments' instances are not removed. Below is the logs from lifecycles

navController.navigate(directionToHostFragment)

  1. HostFragment OnStart HostFragment{c37542c}
  2. TabFragment1 OnStart TabFragment1 {f41b08}

navController.popBackStack()

  1. HostFragment OnPause HostFragment{c37542c}
  2. HostFragment OnStop{c37542c}
  3. HostFragment OnDestroy {c37542c}

navController.navigate(directionToHostFragment) Blockquote

  1. HostFragment OnStart{2670c03}
  2. TabFragment1 OnStart{f45b87d}

navController.popBackStack()

  1. HostFragment OnPause{2670c03}
  2. HostFragment OnStop{2670c03}
  3. HostFragment onDestroy{2670c03}

From ids you can see that there is a new TabFragment1 instance and old one haven't destroyed(I have logs in onPause(), onStop() etc.).

Some code snippets: Adapter for viewPager2 I used -

class LessonTabsAdapter(fragmentActivity: FragmentActivity, val pages: List<BaseFragment>) :
    FragmentStateAdapter(fragmentActivity) {
    override fun getItemCount() = pages.size
    override fun createFragment(position: Int) = pages[position]
}

Some part from TabFragment1

class TabFragment1 : BaseFragment(R.layout.fragment_tab_1) {
    private var mediaPlayer: MediaPlayerClass? = null
    private lateinit var player: SimpleExoPlayer

    private val viewModel by sharedViewModel<SomeViewModel>()
    private val binding by viewDataBinding(FragmentTab1Binding::bind)
    //Overriden onViewCreated(..) and some private methods 
}

So any hints how to deal with this problem?

4

1 回答 1

0

当您打开 HostFragment 时,ViewPager2会在提供的生命周期中创建一个片段。在这种情况下,您将活动作为参数传递,因此它是在Activity's生命周期中创建片段。您可以通过打印 activity?.supportFragmentManager?.fragments 列表来进行检查。如果您想将ViewPager2的孩子与耦合HostFRagment,则需要将片段实例传递给FragmentStateAdapter. 检查2我添加的功能。实现的最佳方法ViewPager2是使用 function 3

1..
public FragmentStateAdapter(@NonNull FragmentActivity fragmentActivity) {
  this(fragmentActivity.getSupportFragmentManager(),fragmentActivity.getLifecycle());
}

2.//
public FragmentStateAdapter(@NonNull Fragment fragment) {
  this(fragment.getChildFragmentManager(), fragment.getLifecycle());
}

3.//
public FragmentStateAdapter(@NonNull FragmentManager fragmentManager, @NonNull Lifecycle lifecycle) {
   mFragmentManager = fragmentManager;
   mLifecycle = lifecycle;
   super.setHasStableIds(true);
}
于 2021-08-13T21:37:40.887 回答