事先搜索过这个问题,我可以找到许多关于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那么我将它从FrameLayoutusing中删除.removeAllViews()。这里我遇到了问题:我没有看到任何onPause()...onDestroy()方法Fragment在ViewPager通过FragmentPagerAdapter.
从用户的角度来看,该应用程序运行良好。经过几轮ViewPager被移除后,我可以看到 GC 正在回收内存。但是,我不喜欢Fragment没有调用这些 s 的生命终结方法的事实,因为我无法在其中进行任何清理,而且它看起来并不“正确”。
有没有一种方法可以挂钩,以便在s与其父级分离时删除ViewPager's Fragments ,也许?ViewPager换句话说,当我知道ViewGroup不再使用 s 时,我会在FragmentTransaction某处(可能在 s 中FragmentPagerAdapter)执行 s 以删除那些Fragments。
或者,我意识到我可以ViewPager永久保留右侧,并动态交换其中的Fragments。当然,在某些时候它只保留一页并不重要。如果这将是一个更好的方法,那么我将重构我的代码来做到这一点,但我会很感激意见。