Fragment随笔
来源:互联网 发布:剑网三mac可以玩吗 编辑:程序博客网 时间:2024/06/05 11:30
前言:本文基于相关文章加以整理、汇编。
FragmentActivity是为弥补早期 Activity没有 Fragment功能而出现;
====================
在使用ViewPager与Fragment的时候,ViewPager会自动缓存1页内的数据,如下图:
当我们当前处在页面2的时候,页面1和页面3的View实际上已经创建好了,所以在我们拖动的时候是可以看见他们的界面的。但是当我们的页面处在1的时候,页面3实际上就已经销毁了。直到跳转到页面2的时候,页面3才会创建View。这时,如果页面3中有需要耗时的事件,比如网络访问。那么,在我们进行 1–>2 的操作的时候,就会不断的出现页面3加载的对话框(如果有的话)。而且如果快速的 1–>2–>3的切换,3中的内容很可能还没加载出来。添加代码pager.setOffscreenPageLimit(2);就可以让ViewPager多缓存一个页面,这样上面的问题就得到了解决。
======================
坑1:一般情况都会想当然的以为进程被杀掉之后,Fragment也会被回收
其实,Fragment有自己的生命周期,有自己的管理器(FragmentManager),也即:包含Fragment的进程被干掉,Fragment不一定会被回收,而是由FragmentManager来决定生死。
Q:如何验证上面的说法?
A:如果是一般正常的流程“打开-关闭”软件,Fragment的确被回收了。但是如果使用“腾讯手机管家”之类的内存清理工具,清理内存(实际上是杀死进程),会发现Fragment没有被回收,一直缓存着。验证方法如下:缓存Fragment的Tag到本地数据库(可以是xml/sqlite等),然后用FragmentManager.findFragmentByTag(…)是否为Null来验证Framgent是否被回收了。
有个奇怪的现状是:在上面蓝色的情况发生后,Framgent和包含他的Activity的生命周期顺序都乱套了,原本是:
Activity.onCreate–>Fragment.onCreate–>Fragment.onCreateView
变成:
Fragment.onCreate–>Activity.onCreate–>Fragment.onCreateView
猜测是因为直接用的Frament缓存,其onCreate先于父Activity.onCreate执行了。
======================
配置(Configuration )改变是Android应用生命周期的一部分,如果发生了该事件(屏幕从横屏换行为竖屏),就会导致Activity被销毁然后重新创建。就算您在配置文件中设定Activity为竖屏显示的 也无法避免,应为Android应用配置改变的情况有很多种。
如果发生了这种情况,Fragment也会被销毁然后重新创建。如果您是在运行时(在Java代码中添加Fragment到Activity,不是在Activity的布局文件中声明的)创建的,则需要额外小心:
当Activity第一次创建的时候,您需要添加Fragment;当由于配置条件改变导致Activity被重新创建则无需再次添加Fragment(系统会自动添加Fragment)。
所以问题来了,您如何知道何时应该在onCreate函数中添加Fragment呢?
判断的方法就是检查 savedInstanceState 参数,如果该参数为null说明是第一次创建,需要添加Fragment;如果不是null则无需添加。代码如下:
public class MyActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstnaceState); // Only add fragment if this is the initial Activity creation if (savedInstanceState == null) { FragmentManager fragmentManager = getFragmentManager() FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); ExampleFragment fragment = new ExampleFragment(); fragmentTransaction.add(R.id.fragment_container, fragment); fragmentTransaction.commit(); } else { // Don't add the fragment! // (and use savedInstanceState to restore Activity state) } }}
如果您没有按照上面的方式添加Fragment,则您的应用可能会出现一种奇怪的现象,同样的Fragment添加了多次。 关于Fragment使用的更多文档请参考 开发者指南 。
- Fragment随笔
- fragment随笔
- Fragment随笔(一)
- Fragment的使用随笔
- android 项目学习随笔三(Fragment )
- Android随笔随想-GUI-Fragment相关学习
- android 学习随笔二十三(动画:Fragment )
- 随笔:关于使用fragment出现的一个bug
- 随笔
- 随笔
- 随笔
- 随笔
- 随笔
- 随笔
- 随笔
- 随笔
- 随笔
- 随笔
- 6分钟彻底掌握存储和备份区别
- 实战:上亿数据如何秒查
- java内存泄露
- 1001—大搬家
- THINK IN JAVA##CHAPTER ONE
- Fragment随笔
- ios8屏幕适配
- Java基础之String类详解
- 开启CSDN博客
- Bitnami-Redmine备份迁移恢复
- akka入门-远程调用
- socket编程基础
- HUST 1408 公交系统
- Altium Designer 10学习