大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
Fragment
成都创新互联科技有限公司专业互联网基础服务商,为您提供雅安机房托管,高防服务器,成都IDC机房托管,成都主机托管等互联网服务。
由于Activity太“重”不能动态注册、不能模块化,因此引入Fragment
一、生命周期
onAttach():Fragment和Activity相关联时调用。可以通过该方法获取Activity引用,还可以通过getArguments()获取参数。
onCreateView():创建Fragment的布局。
onActivityCreated():当Activity完成onCreate()时调用。
onDestroyView():当Fragment的UI从视图结构中移除时调用。
onDetach():当Fragment和Activity解除关联时调用。
其它生命周期与Activity相同
上面的方法中,只有onCreateView()在重写时不用写super方法,其他都需要。
二、注意事项
1、参数传递 使用setArg(“bundle”),Fragment最好创建个newInstance(xx),让调用者不需要知道key名称
2、getActivity在onAttach中获取.
3、提交尽量用Commit,如在异步中提交,建议使用commitAllowingStateLoss()
commit -> 安排当前事务FragmentTransaction进行提交。异步,必须在Activity的onSaveInstanceState调用之前提交。否则会抛异常。
commitAllowingStateLoss -> 和commit类似。但是如果本次是在Activity的onSaveInstanceState调用之后,那么本次提交记录在Activity恢复的时候,可能不被保存。
commitNow() ->将事务立即提交。所有添加的Fragment会被立即初始化,并开始生命周期。所有被移除的Fragment将会被立即移除。
调用这个方法,相当于调用commit,然后调用FragmentManager的executePendingTransactions()。
commitNowAllowingStateLoss() -> 和commitNow类似。但是如果在在Activity的onSaveInstanceState调用之后,那么本次提交记录在Activity恢复的时候,可能不被保存。
4..当FragmentA(初始化)和FragmentB(后启动)调用 fragmentTransaction.replace()
"新建" (onAttach->onCreate->onCreateView->onActivityCreated)
"显示" (onStart->onResume)
"隐藏" (onPause->onStop)
“结束” (onDestroyView->onDestroy->onDetach)
FragmentA "打开"--->执行 "新建" 再执行FragmentA 的"显示"
FragmentB "打开"--->执行FragmentA "隐藏" 再才执行FragmentA “关闭” 执行 Fragment B "新建" 再执行Fragment B 的"显示"
FragmentB "关闭"--->执行FragmentB "隐藏" 再才执行FragmentB “关闭” 最后执行FragmentA 的"显示"
5、防止fragment重新加载,浪费用户流量或者影响用户体验。对于FragmentTransation的replace方法,官方的建议是如果上一个fragment是不保留的情况下可以使用。否则的话采用先add然后根据需求hide或者show,这样可以实现fragment缓存,另外一张情况就是和ViewPager联合使用,然后设置setOffscreenPageLimit()这个方法设置缓存的页面的大小。
加回退栈的操作,如果使用 addToBackStack(String)将会抛出一个 IllegalStateException的异常。
参考:
基础(转载):https://www.jianshu.com/p/11c8ced79193
进阶(转载):https://www.jianshu.com/p/d9143a92ad94
备注:个人笔记,有错请及时指出,谢谢 联系QQ:285232718