转载自:https://www.cnblogs.com/bimingcong/p/10276450.html

ViewPager中Fragment的重复创建、复用问题

 在ViewPager中的Fragment的生命周期  随着页面的切换 当前的展示页相邻的页面生命周期一直在变化

在这里插入图片描述

一开始 刚进入Activity时候,ViewPager默认初始化好前两个Fragment(消息和任务)

消息 ->任务

05-09 14:47:39.593 31509-31509/tyh.com.tablayout E/TYH: 团队onAttach
05-09 14:47:39.593 31509-31509/tyh.com.tablayout E/TYH: 团队onCreate
05-09 14:47:39.593 31509-31509/tyh.com.tablayout E/TYH: 团队onCreateView
05-09 14:47:39.603 31509-31509/tyh.com.tablayout E/TYH: 团队onStart
05-09 14:47:39.603 31509-31509/tyh.com.tablayout E/TYH: 团队onResume

任务 ->团队

5-09 14:55:26.932 31509-31509/tyh.com.tablayout E/TYH: 消息onPause
05-09 14:55:26.932 31509-31509/tyh.com.tablayout E/TYH: 消息onStop
05-09 14:55:26.932 31509-31509/tyh.com.tablayout E/TYH: 消息onDestroyView
05-09 14:55:26.932 31509-31509/tyh.com.tablayout E/TYH: 部门onAttach
05-09 14:55:26.932 31509-31509/tyh.com.tablayout E/TYH: 部门onCreate
05-09 14:55:26.942 31509-31509/tyh.com.tablayout E/TYH: 部门onCreateView
05-09 14:55:26.942 31509-31509/tyh.com.tablayout E/TYH: 部门onStart
05-09 14:55:26.942 31509-31509/tyh.com.tablayout E/TYH: 部门onResume

团队 ->部门

05-09 14:57:18.371 31509-31509/tyh.com.tablayout E/TYH: 任务onPause
05-09 14:57:18.371 31509-31509/tyh.com.tablayout E/TYH: 任务onStop
05-09 14:57:18.371 31509-31509/tyh.com.tablayout E/TYH: 任务onDestroyView

部门 ->团队

05-09 15:00:50.918 31509-31509/tyh.com.tablayout E/TYH: 任务onCreateView
05-09 15:00:50.918 31509-31509/tyh.com.tablayout E/TYH: 任务onStart
05-09 15:00:50.918 31509-31509/tyh.com.tablayout E/TYH: 任务onResume
你会发现 当 Fragment完成onCreate之后再去切换的时候 只会执行onCreateView和onDestroyView方法不会再去onCreate

那么如何避免重复的创建和销毁呢 解决方案如下:

方案一(不推荐):

mViewPager.setOffscreenPageLimit(4);

方案二(推荐):
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    if(view==null){
view = inflater.inflate(R.layout.contentfragment,container,false);
        tvContent = (TextView) view.findViewById(R.id.tv_content);
        String string = getArguments().getString(KEY);
        tvContent.setText(string);
        tvContent.setTextColor(Color.BLUE);
        tvContent.setTextSize(30);
    }
    return view;
}
@Override
public void onDestroyView() {
    super.onDestroyView();
    if(view!=null){
view.getParent().remove(view);
    }
}
如此当重新创建Fragment的时候就会复用之前创建好的View不会重复创建
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐