Android回顾--(十七) Fragment的使用与必踩之坑

Android回顾--(十七) Fragment的使用与必踩之坑,第1张

  碎片,抽象的理解就是一个控件,只是这个控件内部维护了自身的生命周期。Fragment是依赖于Activity,用于显示页面的一部分内容。

这里有的人就会提出疑问了,Android中其他的控件也能在页面显示一部分的内容,为什么还要引入Fragment?

像控件一样,在XML文件里面声明控件 然后控件就显示出来了

Fragment中的控件的事件的处理:

注意:replace()实际是先清除容器里面的Fragment,调用remove方法,然后再执行添加当前的Fragment,add()方法。如果我们每一次都用replace()的话,那么会造成一个问题,就是每一次都会先将前一个先删除,后面一个才能添加上。 造成每一个都需要重新CreatView()那么这么做的话,如果连续不断的去切换的话就会造成卡顿现象,为了解决这个问题就引出了一个概念就是Fragment的优化

注意事项:当我们添加进一个Fragment后,然后再向这个container中添加哪个Fragment的话,那么前一个Fragment没有被杀掉,只是没有显示而已

将当前Fragment的界面显示至帧布局中

我们一般是在onActivityCreateed()方法中处理一些事务。在使用过程中我们要注意一下几点、:

使用工厂类

栈的存储模式:先进后出

Activity也有自己的回退栈

事务:指的是一系列指令的合集,这一系列的指令要么全部执行,要么都不执行

这个地方的id是ft.commit()的返回值,不是Fragment得id

Activity用来管理Fragment。因为一个Fragment可以被多个Activity嵌套,有个共同的业务模块就可以复用了

Fragment具有自己生命周期,是模块化UI的良好组件。

Fragment的生命周期是寄托到Activity中,Fragment可以被Attach添加和Detach释放。

Fragments是view controllers,它们包含可测试的,解耦的业务逻辑块,由于Fragments是构建在views之上的,而views很容易实现动画效果,因此Fragments在屏幕切换时具有更好的控制。

Fragment可以像普通对象那样自由的创建和控制,传递参数更加容易和方便,也不用处理系统相关的事情,显示方式、替换、不管是整体还是部分,都可以做到相应的更改。

可以看出Fragment生命周期与Activity类似

解释如下:

上面的方法中,只有onCreateView()在重写时不用写super方法,其他都需要。

因为Fragment依赖Activity,那么Fragment和Activity的生命周期可谓是息息相关,如下图所示

Activity的FragmentManager负责调用队列中Fragment的生命周期方法,只要Fragment的状态与Activity的状态保持了同步,托管Activity的FragmentManager便会继续调用其他生命周期方法以继续保持Fragment与Activity的状态一致。

Activity-onCreate(begin) ,Fragment-onAttach-onCreate-onCreateView-onViewCreated, Activity-onCreate(end) ,Fragment-onActivityCreated, Activity-onStart ,Fragment-onStart, Activity-onResume ,Fragment-onResume

Fragment-onPause, Activity-onPause ,Fragment-onStop, Activity-onStop

Activity-onRestart-onStart ,Fragment-onStart, Activity-onResume ,Fragment-onResume

Fragment-onPause, Activity-onPause ,Fragment-onStop, Activity-onStop ,Fragment-onDestroyView-onDestroy-onDetach, Activity-onDestroy

Fragment的管理则交由FragmentActivity的FragmentManager来实现。

获取方式:

注意 :在fragment创建childFragment的时候,需要注意的是:使用getChildFragmentManager() 使用getFragmentManager()会导致内存泄漏

常用API:

popBackStackImmediate相关的方法与上面逻辑是一样的与上面不同的是,在调用的时候会立即执行d出。

通过FragmentTransaction实现在Activity运行时可动态地加入、移除、交换Fragment

FragmentTransaction的主要方法介绍

针对在一个Activity中的某个Layout中切换Fragment,无非两种方法:

当移除或替换一个片段并向返回栈添加事务时,系统会停止(而非销毁)移除的片段。 如果用户执行回退 *** 作进行片段恢复,该片段将重新启动。

具体实例可参看: Fragment的addToBackStack()使用

commit(), commitNow()和commitAllowingStateLoss()区别分析

实例:

使用setArguments(Bundle args)传递,在onCreate中使用getArguments()取出。和Activity的Intent恢复机制类似。

1、如果你需要在Fragment中用到宿主Activity对象,建议在你的基类Fragment定义一个Activity的全局变量,在onAttach中初始化,这不是最好的解决办法,但这可以有效避免一些意外Crash。

2、onHiddenChanged的回调时机

当使用add()+show(),hide()跳转新的Fragment时,旧的Fragment回调onHiddenChanged(),不会回调生命周期方法,而新的Fragment在创建时是不会回调onHiddenChanged()

推荐阅读: Fragment全解析系列(二):正确的使用姿势 、 Fragment全解析系列(一):那些年踩过的坑

Fragment中的onCreateView的时候 要求返回一个创建好的视图View,你只需要将你的

LinearLayout,定义在这个view中即可

关于Fragment介绍及生命同期:

1、Fragment的产生与介绍

Android运行在各种各样的设备中,有小屏幕的手机,超大屏的平板甚至电视。针对屏幕尺寸的差距,很多情况下,都是先针对手机开发一套App,然后拷贝一份,修改布局以适应平板神马超级大屏的。难道无法做到一个App可以同时适应手机和平板么,当然了,必须有啊。Fragment的出现就是为了解决这样的问题。你可以把Fragment当成Activity的一个界面的一个组成部分,甚至Activity的界面可以完全有不同的Fragment组成,更帅气的是Fragment拥有自己的生命周期和接收、处理用户的事件,这样就不必在Activity写一堆控件的事件处理的代码了。更为重要的是,你可以动态的添加、替换和移除某个Fragment。

2、Fragment的生命周期

Fragment必须是依存与Activity而存在的,因此Activity的生命周期会直接影响到Fragment的生命周期。官网这张图很好的说明了两者生命周期的关系:

可以看到Fragment比Activity多了几个额外的生命周期回调方法:onAttach(Activity)当Fragment与Activity发生关联时调用。onCreateView(LayoutInflater, ViewGroup,Bundle)创建该Fragment的视图onActivityCreated(Bundle)当Activity的onCreate方法返回时调用onDestoryView()与onCreateView想对应,当该Fragment的视图被移除时调用onDetach()与onAttach相对应,当Fragment与Activity关联被取消时调用.

注意:除了onCreateView,其他的所有方法如果你重写了,必须先调用父类的该方法


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11400259.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存