我在ViewPager
内使用TabLayout
。 ViewPager
有3页,每页都是一个片段。
当包含TabLayout
的活动开始时,片段回调方法upto onResume()将被调用为fragment1,这是预期的,并且片段1显示在屏幕上。
但是,logcat
表示也会为fragment2调用最多onResume
的回调方法,尽管片段2当前未在屏幕上显示。这看起来很奇怪,因为onResume
只应在片段即将变为可见时被调用。
当我选择fragment2时,为fragment3调用onResume
,尽管没有显示fragment3。所以这种行为似乎有一种模式。
原因可能是什么?
更新:我使用的ViewPager
是FragmentPagerAdapter
的子类。
答案 0 :(得分:3)
如果ViewPager
的默认行为是在Fragment
启动时调用下一个ViewPager
。
您需要使用setOffscreenPageLimit()
setOffscreenPageLimit()
设置应保留在当前页面任一侧的页数
Default value
为1
,因此左侧和右侧的Fragment
位置将保留在内存中。
要阻止调用下一个Fragment
,您需要将0
值设置为OffscreenPageLimit
viewPager.setOffscreenPageLimit(0);
<{1>}对象上的。
修改强>
但我已通过将限制设为ViewPager
来检查。
0
现在无效。当您将限额设置为setOffscreenPageLimit(0)
时,您可以在0
中看到以下警告:
LogCat
所以我建议你打电话给Requested offscreen page limit 0 too small; defaulting to 1
,这会将你的所有3个片段留在内存中,否则不要在ViewPager上调用setOffscreenPageLimit(2)
。
答案 1 :(得分:1)
有两件事导致了这种行为:
片段不需要具有UI,在这种情况下,它永远不会是可见的&#34;在屏幕上。基本上,如果片段附加到Activity,则会根据需要调用其生命周期方法。
ViewPager将项目加载到当前显示的项目的任一侧。这是为了在用户用手指滚动页面时显示内容。默认情况下,屏幕外页面限制为1,这意味着当您的第一个片段是当前项目时,第二个片段将在屏幕上加载以准备滚动。
您始终可以使用getCurrentItem()
检查ViewPager显示的项目。如果您遇到问题是因为片段在超出屏幕外页面限制时被破坏并不必要地重新创建,您可以使用setOffscreenPageLimit()
来增加页面限制。