ViewPager中切换界面Fragment被销毁解析

来源:互联网 发布:矩阵的秩怎么计算 编辑:程序博客网 时间:2024/06/06 20:32

1、应用处景


ViewPager+Fragment实现界面切换,界面数量>=3


 

2、Fragment生命周期以及与Activity生命周期对比


                  



3、题目描述


按上图所说,只有当Fragment所Attached的Activity履行destroy的时辰才会调用onDestoryView办法,然而实际是:

当界面由2切换到1的时辰,3界面对应的Fragment实际上走了如下贱程:



1 -->onPause
2 -->onStop
3 -->onDestroyView


 




再由1切换回2或者3时,3界面对应的Fragment的履行流程:



1 -->onCreateView
2 -->onStart
3 -->onResume


 


可见,界面3对应的Fragment被烧毁并从头创建。




4、原因解析


ViewPager的默认加载体式格式是缓存当前界面前后相邻的两个界面,即最多共缓存包含当前界面在内的三个界面信息。当滑动切换界面的时辰,非相邻界面信息将被开释。

界面2是当前界面,界面1和3是缓存界面,当切换到1时,界面2仍缓存,界面3被烧毁开释,于是便有了onDestroyView的调用。

由1切换到2或3时,界面3又被从头创建,于是走了onCreateView流程。

5、解决规划



  • 计齐截:设置ViewPager的缓存界面数

此规划实用于界面数较少的景象,避免缓存界面太多导致内存吃紧。

办法: 


mPager .setOffscreenPageLimit(2);


参数:int limit    -    缓存当前界面每一侧的界面数




以上述为例,当前界面为1,limit = 2,默示缓存2、3两个界面。如此便避免了界面3被烧毁。

 


  • 规划二:保存状况并恢复

此规划实用于可用界面信息可由状况保存和恢复实现的景象。

在onDestroyView办法内保存相干信息,在onCreateView办法内恢复信息设置。

 


  • 规划三(推荐):复用Fragment的RootView

此规划实用通用处景,推荐应用。

步调1:在onDestroyView办法内把Fragment的RootView从ViewPager中remove





1 @Override
2 public void onDestroyView() {
3 LogUtils.d(TAG , "-->onDestroyView");
4 super .onDestroyView();
5 if (null != FragmentView) {
6 ((ViewGroup) mFragmentView.getParent()).removeView(mFragmentView);
7 }
8 }


 




步调2:在onCreateView办法内复用RootView






 1 @Override
2 public View onCreateView(LayoutInflater inflater, ViewGroup container,
3 Bundle savedInstanceState) {
4 LogUtils.d (TAG, "-->onCreateView");
5 if (null == mFragmentView) {
6 mFragmentView = inflater.inflate(R.layout.fragment, container, false);
7 mListView = (ListView) mFragmentView .findViewById(R.id.mm_listview);
8 mListView.setAdapter(mAdapter);
9 mPbar = (ProgressBar) mFragmentView.findViewById(R.id.pbar_mm_loading);
10 mPbar.setVisibility(View.VISIBLE);
11 }
12
13 return mFragmentView ;
14 }
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 邮箱名字被注册了怎么办 忘了注册的邮箱名字怎么办 大众车钥匙丢了怎么办 锁柜钥匙丢了怎么办 邮箱的储存空间太小怎么办 扣扣邮箱不支持打开文件怎么办 邮箱大师群发不了邮件怎么办 邮政uk密码忘了怎么办 dns配置错误网页打不开怎么办 手机邮箱收不到邮件怎么办 wifi的那个用户密码错了怎么办 天翼校园客户端连不上怎么办 公司不小心外发邮件怎么办 steam账号被盗邮箱被改怎么办 steam被盗绑定邮箱被改怎么办 简历邮件发错了怎么办 发了简历不回复怎么办 发了简历没回复怎么办 发了简历邮件没有回复怎么办 快手绑定的手机号不用了怎么办 绑定银行卡的手机号不用了怎么办 oppo账号密码忘了怎么办 魅族账号密码忘了怎么办 苹果手机账号密码忘了怎么办 oppo手机账号密码忘了怎么办 华为手机账号密码忘了怎么办 vivo手机账号密码忘了怎么办 金立s9密码忘了怎么办 手机密号忘了怎么办 qq号忘了账号怎么办 推特密码忘了怎么办 沃邮箱改密码短信延迟怎么办 被qq好友拉黑了怎么办 网易邮箱字体变小了怎么办 邮箱注册不了全拼怎么办 家用电器接入两相火线后怎么办 手机充电板坏了怎么办 闪电宝商户乱跳怎么办 网易邮箱发错了怎么办 苹果手机邮件无法连接服务器怎么办 好记星平板电脑开不了机怎么办