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 ...
随机推荐
- chrome浏览器美化插件:让你的浏览器页面冒水泡, 游小鱼儿
下载插件和效果图 这是一个让你的浏览器冒泡泡的插件, 浏览网页的时候仿佛置身于海底世界: 插件下载地址:http://files.cnblogs.com/files/diligenceday/chro ...
- react配置之浅谈
//复习 1 .块级作用域 let 和const 2 变量结构 默认值 一般往后写 rest参数(了解) 箭头函数(重要)(x,y)=>{} 3.map 存储高级键值对 4.set集合(去重) ...
- JS传值和传引用
之前看<javascript高级程序设计>时就遇到过一个问题,就是函数传参的问题,书上说是按值传递,而非按引用传递.很多人都会认为js里面有两种传值方式,一种是复制,另一种是数组.对象等按 ...
- Flex 布局教程
今天给大家分享一下flex布局的语法 网页布局(layout)是CSS的一个重点应用. 布局的传统解决方案,基于盒状模型,依赖 display属性 + position属性 + float属性.它对于 ...
- php 与redis 结合 使用predis
分为2步骤 1.下载predis 2.使用predis,让php与redis进行通信 <?php require('autoload.php'); $redis = new Predis\Cli ...
- .NET平台和开发.
- 使用NTP协议服务器时间同步
NTP是用来使系统和一个精确的时间源保持时间同步的协议.建议大家在自己管理的网络中建立至少一台时间服务器来同步本地时间,这样可以使得在不同的系统上处理和收集日志和管理更加容易.我们分别从windows ...
- SqlServer建立存储过程,方便.NET插入自增字段
首先,需要在数据库中创建一个表,以在test数据库创建tableNo表为例: create table tablesNo ( tableName ) not null, --表名 num int no ...
- 每天一个Linux命令 1
nl命令在Linux系统中用来计算文件中行号.nl可以将输出的文件内容自动的加上行号!其默认的结果与cat -n有点不太一样,nl可以将行号做比较多的显示设计,包括位数与是否自动补齐0等等的功能. 1 ...
- WeMall微信商城签到插件Sign的主要源码
WeMall微信商城源码签到插件Sign,用于商城的签到系统,分享了部分比较重要的代码,供技术员学习参考 AdminController.class.php <?php namespace Ad ...