Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 为什么即使片段不在前台,也要调用片段的onStart和onResume方法_Android_Android Fragments_Android Viewpager - Fatal编程技术网

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
初始化时调用next
Fragment
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
    。这是否违反了恢复时的
    含义?