以编程方式删除ViewPager,何时(或我如何确保)包含的碎片被销毁?

事先搜索过这个问题后,我可以find很多关于从ViewPager动态添加和删除所选FragmentViewPager 。 然而,我真正关心的是,当ViewPager被用于通过FragmentPagerAdapter显示Fragment时,我可以以编程方式从其包含的ViewGroup “干净地”删除整个ViewPager ,并确保正确销毁包含的Fragment

为了进一步扩展这个问题,我有一个横向双窗格布局,其中从左侧的Fragment的列表进行选择,然后选择的内容放在FrameLayout的右侧。 关键是内容可能会或可能不会被分页。 因此,内容必须以ViewPager格式显示,或者如果没有分页,则它应直接由单个Fragment表示。

为了显示单个Fragment ,我只是像往常一样执行FragmentTransaction ,以便将Fragment放入FrameLayout容器中。 另一方面,如果要显示的是分页内容,那么我创建一个ViewPager并将其添加为FrameLayout的子级。

当我需要更改内容时,如果以前的内容是一个独立的Fragment那么我可以通过FragmentTransaction .remove()删除它。 当我这样做时, Fragment按预期进入onPause()onDestroy()循环。 如果以前的内容是ViewPager那么我使用.removeAllViews()FrameLayout删除它。 在这里我遇到了问题:我没有看到任何onPause()onDestroy()方法在通过FragmentPagerAdapterViewPager中保存的任何Fragment被调用。

从用户的角度来看,应用程序运行正常。 在几轮ViewPager被删除后,我可以看到GC回收内存。 但是,我不喜欢这样一个事实,那些Fragment的生命终结方法没有被调用,因为我不能在其中进行任何清理,而且它似乎并不“正确”。

ViewPager与其父级分离时,是否有一种方法可以挂钩以删除ViewPagerFragment ? 换句话说,当我知道不再使用ViewGroup ,我会在某处(可能在FragmentPagerAdapter )执行FragmentTransaction来删除那些Fragment

或者,我意识到我可以永久地将ViewPager保持在右侧,并在其中动态交换Fragment 。 当然,在某些时候它只能容纳一页并不重要。 如果这是一个更好的方式,那么我将重构我的代码来做到这一点,但我会很感激的意见。

但是,我不喜欢这样一个事实,那些片段的生命终结方法没有被调用,因为我不能在它们内部进行任何清理,而且它似乎并不“正确”。

如果活动被破坏,他们应该得到清理,如果这对你来说不是太晚(例如,堆问题)。

换句话说,当我知道不再使用ViewGroup时,我会在某处(可能在FragmentPagerAdapter中)执行FragmentTransactions以删除那些片段。

您没有执行事务以将片段放在那里。 因此,您无法轻松执行事务以删除片段。 如果切换到FragmentStatePagerAdapter并调用setAdapter(null) ,则应该通过阅读源代码来破坏寻呼机中的所有现有片段。 FragmentPagerAdapter从不使用remove() ,但FragmentStatePagerAdapter从其destroyItem()方法执行,并且当向setAdapter()提供新的适配器(或null )时,所有现存的片段destroyItem()通过destroyItem()销毁。