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

时间:2012-10-07 00:47:20

标签: android android-fragments android-viewpager

事先搜索过这个问题,我可以找到很多关于从Fragment动态添加和删除所选ViewPager的讨论。我在这里真正关心的是,当ViewPager用于显示ViewGroup时,我可以通过编程方式从包含ViewPager的整个Fragment'干净地删除'通过FragmentPagerAdapter来确保所包含的Fragment被正确销毁。

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

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

当我需要更改内容时,如果之前的内容是独立的Fragment,那么我只需通过FragmentTransaction .remove()将其删除即可。当我执行此操作时,Fragment会按预期执行onPause() ... onDestroy()周期。如果之前的内容是ViewPager,那么我会使用FrameLayout将其从.removeAllViews()中删除。在这里,我遇到了问题:我没有看到在onPause()内的任何onDestroy()中调用任何Fragment ... ViewPager方法通过FragmentPagerAdapter

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

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

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

1 个答案:

答案 0 :(得分:12)

  

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

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

  

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

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