Fragment防止自动清理 (ViewPager滑动时,滑出屏幕后被清理)(转)
原文链接:http://www.xuebuyuan.com/2231000.html
这个问题网上搜一搜发现帖子很多,但是博主试了几种好像没有说的那么好用
一. 比如给ViewPager设置长度,以增加缓存的Fragment数目。(不靠谱)
二. 滑出屏幕的时候存储加载的数据,createView的时候重新读取(需要读写数据,不推荐)
下面介绍我自己用到的方法,你根本想不到原来这么简单。
你先要明白Fragment的生命周期如下

此图能清楚的看出Fragment被后台运行后重新创建的过程
onDestoryView():Fragment被FragmentManagerfag放在后台运行,注意,这里只是在后台运行了,并没有真正的销毁,也就是说,这个片段的进程还是存在的,只是放在了后台运行。
onCreateView():再次显示的时候和第一次创建的时候调用,所以说,只要你的Fragment没有被真正的销毁,你的Fragment的当中的数据是存在的,那么为什么会出现Fragment重复加载的现象呢,这里大多数人犯了一个错误,把控件和数据的初始化放在了onCreateView当中,包括我,之前一直是这么做的,这就导致了你fragment再次唤醒的时候重新加载了界面和数据。
解决方案:
onCreate()是在onCreateView()之前调用的,那么你在onCreate中初始化好在onCreateView中要返回的view和数据,onCreateView只负责返回一个界面视图View就好了。赶紧去试试吧,我今天刚发现的(如下示例)。
补充说明:
错误示范(这种不会导致程序异常,但是会在重新加载Fragment时重新绘制界面):
 public class FragmentTest extends Fragment {
     private View mView;
     @Override
     public View onCreateView(LayoutInflater inflater,
             @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
         mView = inflater.inflate(R.layout.activity_main, container, false);
         return mView;
     }
 }
推荐示例(不会导致Fragment重新加载,但是需要在销毁View的时候remove掉父控件):
 public class FragmentTest extends Fragment {
     private View mView;
     private TextView mTextView;
     @Override
     public void onCreate(Bundle savedInstanceState) {
         // TODO Auto-generated method stub
         super.onCreate(savedInstanceState);
         //初始化视图和数据
         mView = getActivity().getLayoutInflater().inflate(R.layout.activity_main, null);
         mTextView=(TextView)mView.findViewById(R.id.textview1);
         mTextView.setText("HelloWorld");
     }
     @Override
     public View onCreateView(LayoutInflater inflater,
             @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
         return mView;//这里是返回的视图
     }
     @Override
     public void onDestroyView() {
         // TODO Auto-generated method stub
         super.onDestroyView();
         //在销毁视图的时候把父控件remove一下,不然重新加载的时候会异常导致奔溃,提示should remove parent view
         ViewGroup mGroup=(ViewGroup) mView.getParent();
         if(mGroup!=null){
             mGroup.removeAllViewsInLayout();
         }
     }
 }
Fragment防止自动清理 (ViewPager滑动时,滑出屏幕后被清理)(转)的更多相关文章
- 它们的定义ListView,实现Item除去滑动和滑出菜单效果
		
这个程序是基于变化从网上开源项目,详情货源忘记.懒得去搜索,.假设有不合适的地方.请与我联系作者.我会及时回复和处理! 序中主要包括两个ListView,一个是实现側滑删除.一个是側滑出菜单,代码中的 ...
 - 解决iPhone滑动时滑到另一个层级导致卡顿问题
		
问题概览: 两个div都可以滑动时,会造成滑动顶层div时,底层div也会跟着滑动.如图示. 解决方法: 添加CSS即可. 代码如下 * { -webkit-overflow-scrolling: t ...
 - listView 滑动时 滑到一半自动滑动到对应的位置
		
package com.bi.demo; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; impo ...
 - viewpager滑动时页面不能刷新
		
有一种解决方法就是覆盖PagerAdapter中的getItemPosition()方法,这种方案虽然简单,但是因为这种方法是让每次呼叫PagerAdapter时,都会遍历childView,通过ge ...
 - PullToRefreshListView中嵌套ViewPager滑动冲突的解决
		
PullToRefreshListView中嵌套ViewPager滑动冲突的解决 最近恰好遇到PullToRefreshListView中需要嵌套ViewPager的情况,ViewPager 作为头部 ...
 - ViewPager、Fragment、Matrix综合使用实现Tab滑页效果
		
原文地址:http://www.cnblogs.com/kross/p/3372987.html 我们实现一个上面是一个可以左右滑动的页面,下面是三个可点击切换的tab按钮,tab按钮上还有一个激活条 ...
 - Android开发之ViewPager+ActionBar+Fragment实现响应式可滑动Tab
		
今天我们要实现的这个效果呢,在Android的应用中十分地常见,我们可以看到下面两张图,无论是系统内置的联系人应用,还是AnyView的阅读器应用,我们总能找到这样的影子,当我们滑动屏幕时,Tab可 ...
 - andorid自己定义ViewPager之——子ViewPager滑到边缘后直接滑动父ViewPager
		
近期的项目中,有一个需求要用ViewPager中嵌套ViewPager去实现整个效果.没做不论什么处理做出来后,仅仅能不停的滑动子ViewPager,父ViewPager就无法滑动了,这样肯定是不满足 ...
 - ViewPager 滑动一半的判断方法以及左滑右滑判断
		
做项目的时候,会碰到用viewpager + fragments去实现多页滑动.有些时候需要完成:界面在滑动到一半或是一半以上的时候,需要把title之类的切换到下一个页面.这个时候仅仅依赖Viewp ...
 
随机推荐
- cookie跨域和js跨域问题
			
js跨域:主机名,协议,端口号只要有任何一个不同,就不能成立
 - 每天一个linux命令(46)--rcp命令
			
rcp代表“remote file copy”(远程文件拷贝).该命令用于在计算机之间拷贝文件.rcp命令有两种格式.第一种格式用于文件到文件的拷贝,第二种格式用于文件或目录拷贝到另一个目录中. 1. ...
 - 第八篇  一个用JS写的省市县三级联动
			
前些天,做网站用需要用到一个省市县的三级联动,数据要从数据库里面读取,我想了下思路,动手写了下来. 一.思路 js利用Ajax读取控制器里面的函数,利用函数读取存储过程,返回 ...
 - 问题 : lang.NoClassDefFoundError: org/springframework/core/annotation/AnnotatedElementUtils,的解决方法
			
今天在做junit 测试的时候 出现了一个问题,花了一段时间 才解决. java.lang.NoClassDefFoundError: org/springframework/core/annota ...
 - 通过udev创建ASM共享磁盘(RAC)
			
OS:RedHat EL6.0 Oracle: Oracle 11gR2 在Oracle 11gR2,构建RAC时可以通过ASM创建asm disk,但是需要安装asmlib相关软件:对于RedH ...
 - gulp折腾日记——gulp-livereload
			
大家好,虽然在博客园注册了很长一段时间,但我还没在博客园写过博客,这是在博客园的第一篇博客,希望能养成每周写博客的好习惯 O(∩∩)O~~) 今天要聊得是gulp的一个实时刷新的插件gulp-live ...
 - 关于vue-clidown到本地后,拷贝文件库到另外一台电脑上npm run dev编译报错的处理
			
这些天自己在用vue-cli项目,在家里的电脑下下来后写了一些demo,拿到公司继续开发的时候发现删除node_modules文件,运行npm install和npm run 百度,搜狗了好久都没有找 ...
 - (1)写给Web初学者的教案-----学习Web的知识架构
			
1:学习Web的知识架构 前文中我们简单的介绍了一些关于Web的基本知识,这里任老师再次强调一下凡是用浏览器打开的网站我们就称之为Web应用程序(B/S结构).除此之外其它需要下载安装的软件或是手机 ...
 - git 关键词扩展
			
用习惯了svn 的 关键词扩展.自然在git上也会寻找. 不知道啥是svn的关键词扩展? 简单列举下: 对于subversion来说,一些版本信息是不需要手动添加的,subversion提供了关键字替 ...
 - android:layout_gravity和android:gravity属性的区别1
			
一.介绍: gravity的中文意思就是"重心",就是表示view横向和纵向的停靠位置 (1).android:gravity:是对view控件本身来说的,是用来设置view本身的 ...