事先搜索过这个问题,我可以找到很多关于从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
。当然,在某些时候它只能容纳一页并不重要。如果这是一个更好的方法,那么我将重构我的代码来做到这一点,但我会很感激的意见。
答案 0 :(得分:12)
但是,我不喜欢这些片段的生命终结方法没有被调用的事实,因为我无法在其中进行任何清理,而且它似乎并不“正确”。
如果活动被破坏,他们应该得到清理,如果这对你来说不是太晚(例如,堆问题)。
换句话说,当我知道不再使用ViewGroup时,我会在某处(可能在FragmentPagerAdapter中)执行FragmentTransactions以删除那些片段。
您没有执行事务以将片段放在那里。因此,您无法轻松执行事务以删除片段。如果切换到FragmentStatePagerAdapter
并调用setAdapter(null)
,则应该通过阅读源代码来破坏寻呼机中的所有现有片段。 FragmentPagerAdapter
永远不会使用remove()
,但FragmentStatePagerAdapter
会使用destroyItem()
方法,并且当新的适配器(或{{destroyItem()
时,所有现存的片段都会被null
销毁1}})提供给setAdapter()
。