事先搜索了这个问题,我可以找到许多关于动态添加和删除
为了更详细地说明这个问题,我有一个横向两面板的布局,在左侧的
要显示单个
当我需要更改内容时,如果之前的内容是独立的
从用户的角度来看,应用程序运行良好。经过多次删除
有没有一种方法可以钩入,以便在
或者,我意识到我可以将
ViewPager
中选定的 Fragment
的讨论。然而,我真正关心的是当使用 FragmentPagerAdapter
显示 Fragment
时,如何以编程方式从其包含的 ViewGroup
中“干净”地删除整个 ViewPager
,并确保所包含的 Fragment
被正确销毁。为了更详细地说明这个问题,我有一个横向两面板的布局,在左侧的
Fragment
中从列表中进行选择,然后将选择的内容放置在右侧的 FrameLayout
中。关键是内容可能会分页,因此必须以 ViewPager
格式显示内容,或者如果不分页,则直接用单个 Fragment
表示。要显示单个
Fragment
,我只需执行常规的 FragmentTransaction
,将 Fragment
放入 FrameLayout
容器中。另一方面,如果要显示分页内容,则创建一个 ViewPager
并将其作为 FrameLayout
的子项添加进去。当我需要更改内容时,如果之前的内容是独立的
Fragment
,那么我可以通过 FragmentTransaction
.remove()
简单地将其删除。当我这样做时,Fragment
会按预期经历 onPause()
... onDestroy()
循环。如果之前的内容是 ViewPager
,那么我使用 .removeAllViews()
将其从 FrameLayout
中删除。在这里,我遇到了问题:我没有看到任何通过 FragmentPagerAdapter
在该 ViewPager
中保存的 Fragment
中调用任何 onPause()
... onDestroy()
方法。从用户的角度来看,应用程序运行良好。经过多次删除
ViewPager
后,我可以看到 GC 回收内存。然而,我不喜欢这些 Fragment
的生命周期方法未被调用,因为我无法在其中进行任何清理,这似乎不“正确”。有没有一种方法可以钩入,以便在
ViewPager
从其父级分离时删除 Fragment
?换句话说,当我知道该 ViewGroup
不再使用时,我会在某个地方执行 FragmentTransaction
(可能是在 FragmentPagerAdapter
中)来删除这些 Fragment
。或者,我意识到我可以将
ViewPager
永久保留在右侧,并动态交换其中的 Fragment
。当然,在某些时候它只包含一个页面并不重要。如果这是更好的方法,那么我将重构我的代码以执行此操作,但我希望听取您的意见。
destroyItem
中使用FragmentManager
来删除Fragment
。我还从getItemPosition
返回了PagerAdapter.POSITION_NONE
并调用了notifyDataSetChanged()
。通过在删除ViewPager
之前执行此操作,Fragment
的onDestroy
被调用,我很满意。你看到有什么问题吗?使用FragmentPagerAdapter
的原因是我希望所有Fragment
(数量较少)都保留下来,因为我的UI要求在单个接受按钮操作的响应中持久保存来自所有片段的用户数据。 - TrevorFragmentPagerAdapter
意味着从Fragment
分页时不会销毁它,但通过扩展destroyItem
来删除片段,就像FragmentStatePagerAdapter
一样,我可以在需要时删除Fragments
。(我很欣赏要求所有附加的片段都保留下来,这样我就可以要求它们一次性保存用户输入数据,但否则我将不得不重构以使所有片段将此数据传递给主Activity,我宁愿避免这样做。) - Trevor