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