Android 为什么即使片段不在前台,也要调用片段的onStart和onResume方法
我在Android 为什么即使片段不在前台,也要调用片段的onStart和onResume方法,android,android-fragments,android-viewpager,Android,Android Fragments,Android Viewpager,我在表格布局中使用查看页面。ViewPager有3个页面,每个页面都是一个片段。 当包含TabLayout的活动启动时,将为fragment1调用截至onResume()的片段回调方法,正如预期的那样,fragment1将显示在屏幕上 但是,logcat显示,尽管fragment2当前未显示在屏幕上,但也会为fragment2调用直到onResume的回调方法。我觉得这很奇怪,因为只有在片段即将可见时才应该调用onResume 当我选择fragment2时,会为fragment3调用onResu
表格布局
中使用查看页面
。ViewPager
有3个页面,每个页面都是一个片段。
当包含TabLayout
的活动启动时,将为fragment1调用截至onResume()的片段回调方法,正如预期的那样,fragment1将显示在屏幕上
但是,logcat
显示,尽管fragment2当前未显示在屏幕上,但也会为fragment2调用直到onResume
的回调方法。我觉得这很奇怪,因为只有在片段即将可见时才应该调用onResume
当我选择fragment2时,会为fragment3调用onResume
,尽管fragment3没有显示。因此,这种行为似乎有一种模式
这可能是什么原因
更新:我使用的
ViewPager
是FragmentPagerAdapter
的一个子类,如果ViewPager
初始化时调用nextFragment
是ViewPager
的默认行为
您需要使用setOffscreenPageLimit()
setOffscreenPageLimit()
设置当前页面两侧应保留的页数
默认值
为1
,因此左侧和右侧的下一个片段将保留在内存中
要防止调用下一个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,在这种情况下,它永远不会在屏幕上“可见”。基本上,如果一个片段附加到一个活动,它的生命周期方法将被适当地调用
ViewPager将项目加载到当前显示的项目的任一侧。这是为了在用户用手指滚动页面时显示内容。默认情况下,屏幕外页面限制为1,这意味着当第一个片段是当前项目时,第二个片段将被加载到屏幕外以准备滚动
您始终可以使用getCurrentItem()
检查ViewPager显示的项目。如果由于片段在超出屏幕外页面限制时被销毁和不必要地重新创建而出现问题,您可以使用setOffscreenPageLimit()
增加页面限制,我正在使用FragmentPagerAdapter
的子类。但是,无论我使用哪个适配器,当片段在屏幕上不可见时,如何可能调用onResume
。这是否违反了恢复时的含义?