【问题标题】:What happens to fragments destroyed under ViewPager?在 ViewPager 下销毁的 Fragment 会发生什么?
【发布时间】:2013-11-14 10:48:56
【问题描述】:

我有一个有 7 个页面的 ViewPager,我在导航时保留了其中的 4 个,并且在被另外 4 个集合替换后被销毁,然后是 GC。

 gPager.get().setOffscreenPageLimit(4);

在我的自定义FragmentStatePagerAdapter

@Override public Parcelable saveState() { return null; }

我的问题是我收到空指针错误,即使我在 Fragment 像“mDrawerLayout”和mDrawerList 一样被销毁后手动重新初始化了视图。示例:

        View rootView = inflater.inflate(R.layout.drawer_layout_fragment, container, false);
        mDrawerLayout = (DrawerLayout) rootView.get().findViewById(R.id.drawer_layout);
        mDrawerList = (ListView) rootView.get().findViewById(R.id.left_drawer);

如果其他 Fragment 被销毁并且一些正在 ViewPager 页面的屏幕上显示。这些片段是再次重新创建还是只是保留了,即使它经历了onDestory

如果Frag2 被销毁而Frag1 未被销毁。 viewPager(位于主活动中)是否会 再次致电setAdapter?或者它会自动跳过setAdapter,直接去MyCustomPagerAdapter填充被破坏的片段?

@Override

public Fragment getItem(int arg0) {
    SavePref saveState = new SavePref(mContext.get());

    switch(arg0){
        /** Android tab is selected */
        case 0:
            Frag f1 = new Frag1()
            return f1;

        case 1:
            Frag f2 = new Frag2()
            return f2;
    }
}

【问题讨论】:

  • 首先setOffscreenPageLimit(4)表示当前选中的fragment两边的4会保存在内存中。因此,您可能会在内存中保留 8 个片段,不包括当前显示的片段。其次让FragmentStatePagerAdapter保存状态,不要覆盖saveState()
  • @M-WaJeEh 我正在使用覆盖saveState,因为我没有也不会使用onConfig Changes,因此当有orientation change 时我可以保留片段状态不会触发null指针。即使没有方向更改,这是否会影响导航?
  • 我不明白你在说什么。此方法适用于FragmentStatePagerAdapter。你不想FragmentStatePagerAdapter 保存你的片段状态吗?
  • 如果您担心 Fragment 的方向变化,请使用 Fragment 的 onCreate 方法内的 setRetainInstance(true) 方法来保留 Fragment,即使 Activity 被销毁。建议甚至在创建 @ 时使用此方法987654343@ 必须在配置更改后报告给新的Activity

标签: java android android-fragments android-viewpager navigation-drawer


【解决方案1】:

一旦视图分页器破坏了片段,它将使用位置和数组重新创建,使用实例化项时的逻辑..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多