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 }
复制代码

 

posted @   (•̀ω•́)y  阅读(1862)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示