事先搜索过这个问题,我可以找到许多关于Fragment
从ViewPager
. 然而,我在这里真正关心的是如何以编程方式ViewPager
从它的包含中删除整个“干净” ViewGroup
,当它ViewPager
已用于Fragment
通过 a 显示 s 时FragmentPagerAdapter
,并确保包含Fragment
的 s 被正确销毁。
为了进一步扩展这个问题,我有一个横向的两窗格布局,其中从Fragment
左侧 a 内的列表中进行选择,然后将所选内容放置在 a 内的右侧FrameLayout
。关键是内容可能会或可能不会分页。因此,内容必须要么以ViewPager
格式显示,要么如果不分页,则Fragment
直接用单个表示。
为了显示单个Fragment
,我只需FragmentTransaction
像往常一样执行 a ,以便将Fragment
放入FrameLayout
容器中。另一方面,如果要显示分页内容,那么我创建一个ViewPager
并将其添加为FrameLayout
.
当我需要更改内容时,如果以前的内容是独立的,Fragment
那么我可以简单地通过FragmentTransaction
.remove()
. 当我这样做时,Fragment
会按预期经历onPause()
...onDestroy()
循环。如果之前的内容是 aViewPager
那么我将它从FrameLayout
using中删除.removeAllViews()
。这里我遇到了问题:我没有看到任何onPause()
...onDestroy()
方法Fragment
在ViewPager
通过FragmentPagerAdapter
.
从用户的角度来看,该应用程序运行良好。经过几轮ViewPager
被移除后,我可以看到 GC 正在回收内存。但是,我不喜欢Fragment
没有调用这些 s 的生命终结方法的事实,因为我无法在其中进行任何清理,而且它看起来并不“正确”。
有没有一种方法可以挂钩,以便在s与其父级分离时删除ViewPager
's Fragment
s ,也许?ViewPager
换句话说,当我知道ViewGroup
不再使用 s 时,我会在FragmentTransaction
某处(可能在 s 中FragmentPagerAdapter
)执行 s 以删除那些Fragment
s。
或者,我意识到我可以ViewPager
永久保留右侧,并动态交换其中的Fragment
s。当然,在某些时候它只保留一页并不重要。如果这将是一个更好的方法,那么我将重构我的代码来做到这一点,但我会很感激意见。