5

事先搜索过这个问题,我可以找到许多关于FragmentViewPager. 然而,我在这里真正关心的是如何以编程方式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()方法FragmentViewPager通过FragmentPagerAdapter.

从用户的角度来看,该应用程序运行良好。经过几轮ViewPager被移除后,我可以看到 GC 正在回收内存。但是,我不喜欢Fragment没有调用这些 s 的生命终结方法的事实,因为我无法在其中进行任何清理,而且它看起来并不“正确”。

有没有一种方法可以挂钩,以便在s与其父级分离时删除ViewPager's Fragments ,也许?ViewPager换句话说,当我知道ViewGroup不再使用 s 时,我会在FragmentTransaction某处(可能在 s 中FragmentPagerAdapter)执行 s 以删除那些Fragments。

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

4

1 回答 1

12

但是,我不喜欢没有调用那些 Fragments 的生命终结方法的事实,因为我无法在其中进行任何清理,而且它看起来并不“正确”。

当活动被销毁时,它们应该被清理,如果这对你来说还不算太晚(例如,堆问题)。

换句话说,当我知道不再使用 ViewGroup 时,我会在某个地方(可能在 FragmentPagerAdapter 中)执行 FragmentTransactions 以删除这些 Fragment。

您没有执行交易以将片段放在那里。因此,您不能轻易地执行事务来删除碎片。如果您切换到FragmentStatePagerAdapter并调用setAdapter(null),它应该会导致寻呼机中的所有现有片段被破坏,通过我对源代码的阅读。FragmentPagerAdapter从不使用remove(),但FragmentStatePagerAdapter确实从其destroyItem()方法中使用,并且destroyItem()nullsetAdapter().

于 2012-10-07T11:04:11.630 回答