它是什么鬼,有什么用?
我们可以把他看成一个小型的Activity,使用Fragment 我们可以把屏幕划分成几块,然后进行分组,进行一个模块化的管理!从而可以更加方便的在运行过程中动态地更新Activity的用户界面!Fragment并不能单独使用,他需要嵌套在Activity中使用,故称Activity片段。
应用场景
- 适配手机和平板
- 一般主页的每个tab都是用Fragment,类似的一个页面下有多个布局需要切换的时候感觉用Fragment很方便。使用单个Activity+多个Fragment的方式,可以减少内存消耗,提升性能,且界面显示更灵活。
- 面对非常复杂的页面时,可以把它拆分成几个fragment,这样就分担了activity的压力,activity只需要负责管理fragment的生命周期和数据传递,具体的业务逻辑由对应的fragmnet处理。
- 当你一个Activity需要模块化的时候,你可以单独写一个Fragment并且嵌套在任何一个界面,不用担心重复代码。
- 比如 App 中有一个新用户注册功能,包括设置用户名、密码、手机号等等流程,设计师在 UI 设计上将每个流程单独设计成一个界面,引导用户一步步操作。作为开发人员,如果将每一个完善信息的流程单独设置成一个 Activity 的话操作起来就比较繁琐,并且也不易于应用里的逻辑处理,而如果使用 Fragment 并结合回退栈的话,就非常合适了
生命周期
onAttach()
onCreate()
onCreateView()
onActivityCreated()
onStart()
onResume()
onPause()
onStop()
onDestroyView()
onDestroy()
onDetach()
onViewCreated()
不是生命周期中的方法,但介于onCreateView()、onActivityCreated()之间执行,用于初始化控件资源
Fragment与自定义View
1.需要重用的界面(也可以使用自定义view);
2.需要重用,但是和生命周期有关联的界面(只能使用Fragment)。因为只有Fragment有自己的生命周期,自定义view是不会有自己的生命周期的。
Fragment与Activity的交互
1)组件获取
Fragment获得Activity中的组件: getActivity().findViewById(R.id.list);
Activity获得Fragment中的组件(根据id和tag都可以):getFragmentManager.findFragmentByid(R.id.fragment1);
2)数据传递
①Activit传递数据给Fragment:
在Activity中创建Bundle数据包,调用Fragment实例的setArguments(bundle) 从而将Bundle数据包传给Fragment,然后Fragment中调用getArguments获得 Bundle对象,然后进行解析就可以了
②Fragment传递数据给Activity
在Fragment中定义一个内部回调接口,再让包含该Fragment的Activity实现该回调接口, Fragment就可以通过回调接口传数据了
代码场景演示:https://blog.csdn.net/asdf717/article/details/51383750
参考:
5.1 Fragment基本概述
https://developer.android.google.cn/guide/components/fragments?hl=zh_cn
对于Fragment的一些理解
静态加载
Activity的xml中使用fragment标签name属性指定Fragment的全限定类名
动态加载
Activity的xml中使用不指定name属性的fragment标签报错,使用
FrameLayout标签即可