概述:
在使用fragment的路上也是呕心沥血,在此,对Fragment的各个重要的使用细节,问题,和使用场景,做详细总结分析,本篇幅不会对Fragemnt的基本使用,生命周期等作概括介绍
Fragment使用优势简述:
1. 在activity的使用中,默认总会有过渡动画,是因为在切换的时候需要在对内存中做切换,而Fragment则轻量级很多,纵享丝滑的快。
2. 在使用中不需要在manifests中像activity一样需要去注册,更简洁
3. 更好的支持了屏幕展示碎片化的需求
4. Fragment支持同界面展示的嵌套,这一点能够使代码的逻辑结构更清新,一定程度上,对代码起到了解耦的作用
5. 可能还有其他的,在此处就不一一概述
目录:
FragmentManager:
不同的FragmentManager:
见其名,知其意,是关于Fragment的管理器,在开发中,使用比较多;
其中关于Manager,用的比较多的API:
- getSupportFragmentManager():在Activity中使用Fragment的管理器,对所有Fragment进行管理。
- getFragmentManager():与 getSupportFragmentManager()功能是一样的,只是是在Fragment中使用
- getChildFragmentManager():在Fragment嵌套使用中经常使用到,但这里需要注意一个点,看下图:
在fragment创建childFragment的时候,需要注意的是:使用getChildFragmentManager() 使用getFragmentManager()会导致内存泄漏,在嵌套的Fragment中,内部的fragment创建,需要使用getChildFragmentManager()
FragmentManager常用的api:
getFragments():可以获取所有创建时候add进去的所有Fragment;通常可以通过这个api来获取需要指定操作的fragment对象
manager.findFragmentByTag(String tag): 通过TAG获取指定的Fragment;这个TAG,是在创建Fragment时,调用addToBackStack(String tag)进行绑定关系的
popBackStack(): 弹出栈顶fragment
popBackStack(String tag,int flags):
- tag可以为null或者相对应的tag,flags只有0和1(POP_BACK_STACK_INCLUSIVE)两种情况
- 如果tag为null,flags为0时,弹出回退栈中最上层的那个fragment。
- 如果tag为null ,flags为1时,弹出回退栈中所有fragment。
- 如果tag不为null,那就会找到这个tag所对应的fragment,flags为0时,弹出该
fragment以上的Fragment,如果是1,弹出该fragment(包括该fragment)以
上的fragment。
popBackStackImmediate相关的方法与上面逻辑是一样的与上面不同的是,在调用的时候会立即执行弹出。
FragmentTransaction:
管理着Fragment所有的展示交互,还有Fragment的回滚事件
FragmentTransaction常用的api:
- add():将一个Fragment实例对象添加到集合列表的尾部,当展示的时候会在activity的最上层
- remove():将一个Fragment实例对象从存储的集合列表中移除,并且将其从UI界面中销毁
- replace():将上一个Fragmnt的实例对象从存储的集合列表中移除,将当前的Fragment实例对象添加到存储的链表尾部,当展示的时候会在activity的最上层
- hide():将一个fragment,从展示状态隐藏起来,实例对象不被销毁
- show():将一个fragment实例对象,展示出来
addToBackStack():将fragment添加到回退栈中
add() 和 replace() 运用总结:
在项目的使用中,通常习惯使用add()加载,add方式视图不会重建,会被保存起来,而replace()每次都会remove掉前面的视图,而replace方式的回退,旧的视图每一次都会重建,在用户体验上不好。
add()和replace()的使用,不能够混合使用,在混合使用的情况下,会导致回退栈混乱,导致的原因是在回退过程中记录的角标存在问题
hide() 和 show() 运用总结:
通常的使用情况是在主界面上,有多Tab键切换情况
FragmentTransaction事儿需要用到的api:
- detach():将视图View和Fragment分离,视图View也会从ViewTree中删除,还会将Fragment从add的队列中删除,所以在调用isAdd方法的时候返回的是false,但实例对象本身是还存在的,通过FragmentManager的findFragmentByTag还可以获取到实例对象。
- attach():通过fragment的onCreateView()的重建视图,并且被重新加入到add的队列中,并且处于队列头部。