Fragment防止自动清理 (ViewPager滑动时,滑出屏幕后被清理)

这个问题网上搜一搜发现帖子很多,但是博主试了几种好像没有说的那么好用

一.比如给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();
		}
	}
	
	
}








 

转载于:https://www.cnblogs.com/gmm283029/p/4498967.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值