TabLayot+ViewPage2切换tab时,fragment过多会崩溃?

1、问题?

图片.png

当我们的tab很多时,我们的项目是13个tab,直接创建13个fragment,app内存爆满,APP崩溃了,所以我们要考虑懒加载的方式。
注意:当我们的页面tab比较少时,APP不会崩溃的。

老的方式:

//初始化fragment(随便写2个,真实的项目是13个fragment)
val fragmentList = arrayListOf<Fragment>()
    fragmentList.add(BookshelfFragment())
   fragmentList.add(BookshelfFragment())
  private val fragmentAdapter: FragmentStateAdapter by lazy {
        object : FragmentStateAdapter(this) {
            override fun getItemCount(): Int {
                return tabNames.size
            }

            override fun createFragment(position: Int): Fragment {
                return fragmentList.get(position)
            }
        }
    }

分析崩溃的原因: FragmentStateAdapter 中创建的fragment,会被回收销毁,所以下次再用到的时候,可能被销会了。

2、解决:

  /**
     * viewPager adapter
     */
    var fragment: Fragment? = null
    private val fragmentAdapter: FragmentStateAdapter by lazy {
        object : FragmentStateAdapter(this) {
            override fun getItemCount(): Int {
                return tabNames.size
            }

            override fun createFragment(position: Int): Fragment {

                when (position) {
                    0 -> {
                        //书架
                        fragment = BookshelfFragment().apply {
                            arguments?.apply {
                                putInt("type", 1)
                            }
                        }
                    }

                    1 -> {
                        //书城
                        fragment = NewBookCityFragment().apply {
                            arguments?.apply {
                                putInt("type", 2)
                            }
                        }
                    }

                    2 -> {
                        //我的
                        fragment = NewMineFragment().apply {
                            arguments?.apply {
                                putInt("type", 4)
                            }
                        }
                    }
                }
                return fragment!!
            }
        }
    }

分析:在createFragment中,我们把需要的页面去创建fragment,不需要的时候去销毁,不用我们手动管理fragment。
注意:我们不要创建fragmentList 去管理fragment了。

从源码上看当使用 FragmentStatePagerAdapter 时,如果Fragment不显示,那么Fragment对象会被销毁,但在回调onDestroy()方法之前会回调onSaveInstanceState(Bundle outState)方法来保存Fragment的状态,下次Fragment显示时通过onCreate(Bundle savedInstanceState)把存储的状态值取出来, FragmentStatePagerAdapter 比较适合页面比较多的情况,像一个页面的ListView item

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容