为什么即使片段不在前台也会调用片段的 onStart 和 onResume 方法
Why are the onStart and onResume methods for a Fragment called even though the fragment is not in the foreground
我在 TabLayout
中使用 ViewPager
。 ViewPager
有 3 个页面,每个页面都是一个片段。
当包含 TabLayout
的 activity 开始时,会为 fragment1 调用直到 onResume() 的片段回调方法,这是预期的,并且 fragment1 显示在屏幕上。
然而,logcat
表明 fragment2 也调用了 onResume
之前的回调方法,尽管 fragment2 目前没有显示在屏幕上。这对我来说很奇怪,因为 onResume
只应在片段即将可见时调用。
当我select fragment2时,onResume
为fragment3调用,虽然fragment3没有被显示。所以这种行为似乎有一种模式。
这可能是什么原因?
更新:我正在使用的 ViewPager
是 FragmentPagerAdapter
.
的子类
如果 ViewPager
的默认行为是在初始化 ViewPager
时调用下一个 Fragment
。
您需要使用 setOffscreenPageLimit()
setOffscreenPageLimit()
设置应保留到当前页任一侧的页数
Default value
是 1
所以左边和右边的下一个 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)
。
有两件事促成了这种行为:
片段不需要有 UI,在这种情况下它永远不会出现在屏幕上 "visible"。基本上,如果片段附加到 Activity,它的生命周期方法将被适当地调用。
ViewPager 将项目加载到当前显示的项目的任一侧。这是为了在用户用手指滚动页面时显示内容。默认情况下,屏幕外页面限制为 1,这意味着当您的第一个片段是当前项目时,第二个片段被加载到屏幕外以准备滚动。
您始终可以使用 getCurrentItem()
检查 ViewPager 显示的项目。如果您遇到问题,因为片段在超出屏幕外页面限制时被销毁并不必要地重新创建,您可以使用 setOffscreenPageLimit()
.
增加页面限制
我在 TabLayout
中使用 ViewPager
。 ViewPager
有 3 个页面,每个页面都是一个片段。
当包含 TabLayout
的 activity 开始时,会为 fragment1 调用直到 onResume() 的片段回调方法,这是预期的,并且 fragment1 显示在屏幕上。
然而,logcat
表明 fragment2 也调用了 onResume
之前的回调方法,尽管 fragment2 目前没有显示在屏幕上。这对我来说很奇怪,因为 onResume
只应在片段即将可见时调用。
当我select fragment2时,onResume
为fragment3调用,虽然fragment3没有被显示。所以这种行为似乎有一种模式。
这可能是什么原因?
更新:我正在使用的 ViewPager
是 FragmentPagerAdapter
.
如果 ViewPager
的默认行为是在初始化 ViewPager
时调用下一个 Fragment
。
您需要使用 setOffscreenPageLimit()
setOffscreenPageLimit()
设置应保留到当前页任一侧的页数
Default value
是 1
所以左边和右边的下一个 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)
。
有两件事促成了这种行为:
片段不需要有 UI,在这种情况下它永远不会出现在屏幕上 "visible"。基本上,如果片段附加到 Activity,它的生命周期方法将被适当地调用。
ViewPager 将项目加载到当前显示的项目的任一侧。这是为了在用户用手指滚动页面时显示内容。默认情况下,屏幕外页面限制为 1,这意味着当您的第一个片段是当前项目时,第二个片段被加载到屏幕外以准备滚动。
您始终可以使用 getCurrentItem()
检查 ViewPager 显示的项目。如果您遇到问题,因为片段在超出屏幕外页面限制时被销毁并不必要地重新创建,您可以使用 setOffscreenPageLimit()
.