为什么即使片段不在前台也会调用片段的 onStart 和 onResume 方法

Why are the onStart and onResume methods for a Fragment called even though the fragment is not in the foreground

我在 TabLayout 中使用 ViewPagerViewPager 有 3 个页面,每个页面都是一个片段。 当包含 TabLayout 的 activity 开始时,会为 fragment1 调用直到 onResume() 的片段回调方法,这是预期的,并且 fragment1 显示在屏幕上。

然而,logcat 表明 fragment2 也调用了 onResume 之前的回调方法,尽管 fragment2 目前没有显示在屏幕上。这对我来说很奇怪,因为 onResume 只应在片段即将可见时调用。

当我select fragment2时,onResume为fragment3调用,虽然fragment3没有被显示。所以这种行为似乎有一种模式。

这可能是什么原因?

更新:我正在使用的 ViewPagerFragmentPagerAdapter.

的子类

如果 ViewPager 的默认行为是在初始化 ViewPager 时调用下一个 Fragment

您需要使用 setOffscreenPageLimit()

setOffscreenPageLimit() 设置应保留到当前页任一侧的页数

Default value1 所以左边和右边的下一个 Fragment 将保留在内存中。

要防止调用下一个 Fragment,您需要将 0 值设置为 OffscreenPageLimit

viewPager.setOffscreenPageLimit(0);

ViewPager 对象上。

编辑:

但我已经通过将限制设置为 0 进行了检查。

setOffscreenPageLimit(0) 现在将不起作用。当您将限制设置为 0 时,您可以在 LogCat:

中看到以下警告
Requested offscreen page limit 0 too small; defaulting to 1

所以我建议您要么调用 setOffscreenPageLimit(2),这会将所有 3 个片段保存在内存中,否则不要在 ViewPager 上调用 setOffscreenPageLimit(int limit)

有两件事促成了这种行为:

  1. 片段不需要有 UI,在这种情况下它永远不会出现在屏幕上 "visible"。基本上,如果片段附加到 Activity,它的生命周期方法将被适当地调用。

  2. ViewPager 将项目加载到当前显示的项目的任一侧。这是为了在用户用手指滚动页面时显示内容。默认情况下,屏幕外页面限制为 1,这意味着当您的第一个片段是当前项目时,第二个片段被加载到屏幕外以准备滚动。

您始终可以使用 getCurrentItem() 检查 ViewPager 显示的项目。如果您遇到问题,因为片段在超出屏幕外页面限制时被销毁并不必要地重新创建,您可以使用 setOffscreenPageLimit().

增加页面限制