【问题标题】:Fragment instances are kept in viewPager2 when host fragment removed删除主机片段时,片段实例保留在 viewPager2 中
【发布时间】:2021-08-13 07:49:54
【问题描述】:

有一个活动应用程序,我有 HomeFragment 从中打开 HostFragment,HostFragment 有 ViewPager2,其中包含 3 个片段项 TabFragment1、TabFragment2 和 TabFragment3。

当我打开 HostFragment,然后返回时,我的 tabFragment 的实例不会被删除。以下是生命周期的日志

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) 块引用

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

navController.popBackStack()

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

从 ids 你可以看到有一个新的 TabFragment1 实例,旧的还没有销毁(我有登录 onPause()、onStop() 等)。

一些代码sn-ps: 我使用的 viewPager2 适配器 -

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

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 
}

那么任何提示如何处理这个问题?

【问题讨论】:

    标签: android android-viewpager android-viewpager2 fragment-lifecycle fragmentstateadapter


    【解决方案1】:

    当您打开 HostFragment 时,ViewPager2 在提供的生命周期中创建一个片段。在这种情况下,您将活动作为参数传递,因此它在Activity's 生命周期中创建片段。您可以通过打印 activity?.supportFragmentManager?.fragments 列表来进行检查。如果要将ViewPager2 的子代与HostFRagment 耦合,则需要将片段实例传递给FragmentStateAdapter。检查我添加的函数2。实现ViewPager2 的最佳方式是使用函数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);
    }
    

    【讨论】:

    • 不知道我怎么错过了那部分。这对我有用。谢谢@Chhatrasal Singh Bundela。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-07
    • 2019-03-17
    • 1970-01-01
    相关资源
    最近更新 更多