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时重新绘制界面):

 1 public class FragmentTest extends Fragment {
 2
 3     private View mView;
 4
 5     @Override
 6     public View onCreateView(LayoutInflater inflater,
 7             @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
 8         mView = inflater.inflate(R.layout.activity_main, container, false);
 9         return mView;
10     }
11 }

推荐示例(不会导致Fragment重新加载,但是需要在销毁View的时候remove掉父控件):

 1 public class FragmentTest extends Fragment {
 2
 3     private View mView;
 4     private TextView mTextView;
 5
 6     @Override
 7     public void onCreate(Bundle savedInstanceState) {
 8         // TODO Auto-generated method stub
 9         super.onCreate(savedInstanceState);
10         //初始化视图和数据
11         mView = getActivity().getLayoutInflater().inflate(R.layout.activity_main, null);
12         mTextView=(TextView)mView.findViewById(R.id.textview1);
13         mTextView.setText("HelloWorld");
14     }
15     @Override
16     public View onCreateView(LayoutInflater inflater,
17             @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
18         return mView;//这里是返回的视图
19     }
20     @Override
21     public void onDestroyView() {
22         // TODO Auto-generated method stub
23         super.onDestroyView();
24         //在销毁视图的时候把父控件remove一下,不然重新加载的时候会异常导致奔溃,提示should remove parent view
25         ViewGroup mGroup=(ViewGroup) mView.getParent();
26         if(mGroup!=null){
27             mGroup.removeAllViewsInLayout();
28         }
29     }
30 }
时间: 2024-10-12 21:13:01

Fragment防止自动清理 (ViewPager滑动时,滑出屏幕后被清理)(转)的相关文章

PullToRefreshListView中嵌套ViewPager滑动冲突的解决

PullToRefreshListView中嵌套ViewPager滑动冲突的解决 最近恰好遇到PullToRefreshListView中需要嵌套ViewPager的情况,ViewPager 作为头部添加到ListView中,发先ViewPager在滑动过程中流畅性太差几乎很难左右滑动.在网上也看了很多大神的介绍,看了ViewPager的源码.其实思路很简单,只不过没有看到有教完整的说明,为了帮转像我这样的green hand 少走弯路,将过程整理下.大神自动略过~_~: 滑动冲突的解决大概要处

Android中ListView滑动时数据混乱

相信做过Android应用开发的或多或少的都遇到过这样的问题,要不就是在ListView滑动时出现数据混乱,或者是GridView滑动时出现数据混乱.先来看看一位网友写的文章,个人感觉这篇文章挺不错的: Android ListView滑动过程中图片显示重复错位闪烁问题解决 主要分析Android ListView滚动过程中图片显示重复.错乱.闪烁的原因及解决方法,顺带提及ListView的缓存机制. 1.原因分析 ListView item缓存机制:为了使得性能更优,ListView会缓存行i

andorid自己定义ViewPager之——子ViewPager滑到边缘后直接滑动父ViewPager

近期的项目中,有一个需求要用ViewPager中嵌套ViewPager去实现整个效果.没做不论什么处理做出来后,仅仅能不停的滑动子ViewPager,父ViewPager就无法滑动了,这样肯定是不满足的,分析了一下原因,非常显示是整个滑动事件都被子ViewPager消耗掉了,所以仅仅能对ViewPager做一下自己定义处理.才干够实现. 下面是这个需求实现后的效果图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGNxNTIxMTMxNDEyMw=

andorid自定义ViewPager之——子ViewPager滑到边缘后直接滑动父ViewPager

最近的项目中,有一个需求要用ViewPager中嵌套ViewPager去实现整个效果,没做任何处理做出来后,只能不停的滑动子ViewPager,父ViewPager就无法滑动了,这样肯定是不满足的,分析了一下原因,很显示是整个滑动事件都被子ViewPager消耗掉了,所以只能对ViewPager做一下自定义处理,才可以实现.以下是这个需求实现后的效果图: 从图上就可以看出:我们用ViewPager中嵌套了ViewPager,而且要实现的是子ViewPager滑动到最后一页时,再滑就是滑动父Vie

ViewPager 滑动一半的判断方法以及左滑右滑判断

做项目的时候,会碰到用viewpager + fragments去实现多页滑动.有些时候需要完成:界面在滑动到一半或是一半以上的时候,需要把title之类的切换到下一个页面.这个时候仅仅依赖Viewpager的接口是不能判断,这里提供一个方法:判断viewpager是左滑还是右滑,同时对滑过一半的时候(这个参数可以调),进行相关操作. //定义两个变量,这个两个变量是表示滑动时候,positionOffset 是从大到 //小的变化,还是从小到大的变化.用于在滑动时候,避免多次调用一个方法 pr

(转)ViewPager,ScrollView 嵌套ViewPager滑动冲突解决

ViewPager,ScrollView 嵌套ViewPager滑动冲突解决 本篇主要讲解一下几个问题 粗略地介绍一下View的事件分发机制 解决事件滑动冲突的思路及方法 ScrollView 里面嵌套ViewPager导致的滑动冲突 ViewPager里面嵌套ViewPager 导致的滑动冲突 轮播图的几种实现方式 先看一下效果图 ScrollView里面嵌套ViewPager ViewPager里面嵌套ViewPager View的 事件分发机制 这篇博客大打算详细讲解View的事件分发机制

如何禁止viewPager滑动

众所周知,viewPager是能够滑动的,但有时候我们需要禁止它的滑动(微笑地面对*—……—*). 情况是这样的: activity中有一个viewPager,viewPager中加入3个Fragment,第三个Fragment中又使用了一个viewPager,这个viewPager中又加入了几个Fragment(本人不是受虐狂,仅仅是功能需要).如图: 想实现的功能: 点击activity的图标或者滑动的时候能够切换第一个viewPager中的Fragment,点击Fragment3中的图标能

Fragment结合nineold包实现滑动tab页

文章结尾有源码下载.发现很多项目中都有一套属于自己的tab样式和风格.今天,想分享给大家一个自定义tabhost带有匀速滑动的指示器切换fragment的Demo,略显不才,只能分享简单的东西,后面有源码下载.搞了一个视频和gif,好像这不能传,只能传图片了.不懂怎么排版,好乱的感觉. public class MainFragment extends Fragment implements TabContentFactory, OnTabChangeListener, OnPageChange

RecyclerView使用 及 滑动时加载图片优化方案

RecyclerView使用 及 滑动时加载图片优化方案 简述 本篇博文主要给大家分享关于RecyclerView控件的使用及通过继承RecyclerView来实现滑动时加载图片的优化方案,也同样能解决防止图片乱序的问题,之前有在网上有看到大神对Android中ListView异步加载图片乱序问题进行过分析,并深入剖析原理后分别给出了3种对应的解决方案:一 .使用findViewWithTag.二.使用弱引用关联.三.使用Volley框架提供的NetworkImageView. 看了之后思索了很