繁体   English   中英

了解片段活动生命周期

[英]Understanding fragment activity lifecycle

我创建了一个Android应用程序,它使用ViewPager来浏览三个片段(三个片段中的每一个都包含一个gridview)。

我最近开始学习片段,并假设在我的网格视图在其片段中创建后,每个片段都将在内存中,而不必再次加载。

最近我注意到,当我从左侧片段滑动到中间片段,然后到右侧片段时,最左边的片段必须再次使用我的适配器填充其gridview。

我只是想知道为什么当我从最左边的片段导航到最右边的片段时会发生这种情况,而不是当我在并排片段之间导航时。 它是否只将最新的片段保留在内存中并杀死其他片段? 或者是否有其他原因导致应用程序无法将所有三个片段保留在内存中? 当我在片段之间快速导航时,我的应用程序会有点滞后和缓慢,所以如果可能的话,只需要一次绘制每个gridview就好了。

我在onCreate()中填充我的arraylist(用于填充适配器),然后用onActivityCreated中的适配器填充我的gridview(Bundle savedInstanceState)

ViewPagerViewPager保留了一定数量的屏幕外标签(当然是Fragment )。 我相信所有设备的默认值为1.因此,当您滚动到最右侧时,只有左侧的那个将保留在内存中。

如果您希望ViewPager保留内存中的所有选项卡(小心 - 这可能在设备或其他正在运行的应用程序上很难),您可以设置要在内存中保留多少屏幕外选项卡。 为此, ViewPagerViewPager对象上使用setOffscreenPageLimit方法。

例:

ViewPager pager = (ViewPager) findViewById(R.id.pager); // Your pager's ID
pager.setOffscreenPageLimit(2); // Will retain 2 off-screen tabs + your selected tab

希望这可以帮助!

这是FragmentPagerAdapterFragmentPagerStateAdapter如何工作的本质。 来自Google的网站:

The fragment of each page the user visits will be kept in memory, though its view hierarchy may be destroyed when not visible.

这意味着,您的GridView正在重新填充,因为您的ViewPager了视图并且必须重建它。

编辑:如果你需要将所有三个片段Views保留在内存中以加快速度,那么你必须创建自己的PagerAdapter ,它将视图存储在某种Collection中的instantiateItem(ViewGroup, int)

或者,如果您逐字使用Google的示例,那么您可能正在执行以下操作:

@Override
public Fragment getItem(int position) {
  return ArrayListFragment.newInstance(position);
}

在这种情况下,每次ViewPager请求时,您都在重建一个新片段。

默认情况下, ViewPager从左侧一个片段和当前页面右侧一个片段保持空闲状态。 您可以使用ViewPager.setOffscreenPageLimit()更改此行为。 查看文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM