• 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 }

     

  • 相关阅读:
    【stanford】梯度、梯度下降,随机梯度下降
    [philosophy]空间
    【crawler】heritrix 3 使用
    【database】database domain knowledge
    【java】Java异常处理总结
    【computer theory】一、集合、关系和语言
    【java】ubuntu部署web项目war包到tomcat上
    【MachineLeaning】stanford lesson one
    【数据立方】由表和电子数据表到数据立方体,cuboid方体
    PHP变参函数的实现
  • 原文地址:https://www.cnblogs.com/laishenghao/p/5157914.html
Copyright © 2020-2023  润新知