【问题标题】:Understanding fragment activity lifecycle了解片段活动生命周期
【发布时间】:2012-07-17 04:40:16
【问题描述】:

我创建了一个 Android 应用,它使用 ViewPager 滑动浏览三个片段(三个片段中的每一个都包含一个网格视图)。

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

最近我注意到,当我从左侧 Fragment 滑动到中间 Fragment 再到右侧 Fragment 时,最左边的 Fragment 必须用我的适配器再次填充它的 gridview。

我只是想知道为什么当我从最左侧的片段导航到最右侧的片段时会发生这种情况,而不是在我并排的片段之间导航时会发生这种情况。它是否只将最近的片段保留在内存中并杀死另一个片段?还是有其他原因导致应用程序不会将所有三个片段都保留在内存中?当我在片段之间快速导航时,我的应用程序会变得有点迟钝和缓慢,所以如果可能的话,最好只绘制每个 gridview 一次。

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

【问题讨论】:

    标签: android android-fragments android-lifecycle


    【解决方案1】:

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

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

    例子:

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

    希望这会有所帮助!

    【讨论】:

    • 啊!忘记了这个方法。最佳解决方案。
    • 完美。感谢@Eric 的帮助!
    【解决方案2】:

    这是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 将视图存储在 instantiateItem(ViewGroup, int) 中的 Collection 中.

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

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

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

    【讨论】:

    • 我们中的一些人只是在片段集合中的请求位置返回一个片段 return this.fragments.get(position);这不是显式创建新片段,但如果您不更改 setOffscreenPageLimit(),它将重新创建片段视图。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2019-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-21
      • 1970-01-01
      • 2012-02-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多