Fragment防止自动清理 (ViewPager滑动时,滑出屏幕后被清理)(转)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }
以上是关于Fragment防止自动清理 (ViewPager滑动时,滑出屏幕后被清理)(转)的主要内容,如果未能解决你的问题,请参考以下文章
使用ViewPager切换Fragment时,防止频繁调用OnCreatView
当 ViewPager 显示 Fragment 时 EditText 自动打开软键盘
ViewPager中带有StaggeredGridLayoutManager的RecyclerView,返回fragment时自动排列item
如何在 Fragment 对象中控制 ViewPager 更改页面
FragmentStatePagerAdapter和FragmentPagerAdapter区别
Android 嵌套滚动NestedScrollView+TabLayout+ViewPager+Fragment+RecyclerView 实现京东美团首页效果Tab页滚动到顶部时自动吸附