大家好,今天我来给大家讲一讲关于安卓面试中的Fragment的面试题目,那么接下来接入正题:
一、Fragment为什么会被成为第五大组件?
1.Fragment为什么会被称为第五大组件
众所周知,在安卓中中有四大组件,分别是Activity,广播,service,Content provider.在实际项目开发过程中,Fragment的使用频率和作用都是十分突出的,所以说在这里把Fragment列为第五大组件也是可以的.有些说法把view列为第五大组件,但是由于view没有生命周的,这是和Fragment的不同之处.有了生命周期,Fragment可以像activity灵活的进行处理.
Fragment为什么会出现呢?
它其实是在安卓3.0出现的,起初啊,它只是为了给大屏幕设备上更加灵活的展现UI所设计的.
Fragment的优点:Fragment相比Activity更加节省内存,同时UI的切换效果也更加的舒适.
综上所述,大家可以这样回答:首先在使用频率上,Fragment是不属于其它四大组件的,它有自己的生命周期,同时它可以动态灵活的加载Activity,所以说Fragement可以被称为第五大组件,同时Fragment并不是像Activity一样完全独立的,它虽然有自己的生命周期,但是它必须依附与Activity,同时它要加载到Activity当中.
2.Fragment加载到Activity的两种方式
1)添加Fragment到Activity的布局文件当中(静态加载)
把Fragment直接写入Activity布局当中,作为XML的一个标签
2)动态在Activity中添加Fragment(动态加载)
它使用的是FragmentManager来管理所有要启动的Fragment,利用FragmentTransaction添加和替换相对应的Fragment,并用容器资源来作为标记位,设置Fragment所要显示到的Activity当中的位置,最后,需要提交commit方法来完成整个步骤.
3.FragementPagerAdapter与FragmentStatePagerAdapter区别
FragementPagerAdapter适用于页面较少的情况,而FragmentStatePagerAdapter用于页面较多的情况.
我看了一下源码,首先来看FragmentStatePagerAdapter
在destroyItem这个方法中,最后一行,它使用的是mCurTransaction.remove(fragment)方法,它是真正的释放了Fragment 的内存FragmentStatePagerAdapter是比FragementPagerAdapter更加节省内存的.
我们再来看FragementPagerAdapter
在destroyItem这个方法中,它最后一行,它是调用了mCurTransaction.detach((Fragment)object);这个方法意味着什么,它并不是真正的内存回收,它只是把fragment的UI和Activity的UI所脱离开来,它并不会收内存.
所以我们可以这样回答:
由于FragmentStatePagerAdapter在每次切换Viewpager的时候,它是回收内存的,所以说它适合那些页面比较多的情况,因为页面比较多的时候,比较耗费内存,它会回收内存.而FragementPagerAdapter,它并没有回收内存,它只是把UI分离,所以说它适合页面比较少的情况,保存一下内存,对系统也没有多大影响
二、Fragment的生命周期
首先,我们来看一下官网上面的生命周期图
可以看到 Fragment 的生命周期和 Activity 很相似,只是多了以下几个方法:
onAttach() 在Fragment 和 Activity 建立关联是调用(Activity 传递到此方法内)
onCreateView() 当Fragment 创建视图时调用
onActivityCreated() 在相关联的 Activity 的 onCreate() 方法已返回时调用。
onDestroyView() 当Fragment中的视图被移除时调用
onDetach() 当Fragment 和 Activity 取消关联时调用。
可以看下几种操作情况下Fragment 的生命周期变化
管理 Fragment 生命周期和 Activity 生命周期很相似,同时 Activity 的生命周期对 Fragment 的生命周期也有一定的影响,如下图:
用下图来表示 Activity 和 Fragment 的生命周期变化的先后过程是:
Fragment 生命周期与 Activity 生命周期的一个关键区别就在于,Fragment 的生命周期方法是由托管Activity而不是操作系统调用的。Activity 中生命周期方法都是 protected,而 Fragment 都是 public,也能印证了这一点,因为 Activity 需要调用 Fragment 那些方法并管理它。
三、Fragment之间的通信
1.fragment与activity之间的通信
只要调用getActivity,就可以获取到Activity中的方法
2.fragment与fragment之间的通信
和fragment中调用Activity方法有相同地方,首先,可以通过getActivity获取Activity方法,然后通过findFragmentByid取到Activity中所对应的另外一个Fragment的方法,这样就实现了fragment与fragment的通信
3.activity与fragment之间的通信
常用的方法是接口回调,你在fragment中创建一个接口,然后Activity来实现,这样就能完成Activity调用Fragment中的方法
四、Fragment管理器:FragmentManager
Fragment的replace、add、,remove方法;
add是将fragment的实例添加到Activity的最上层,而remove大家都知道,它就是将fragment的实例从activity与fragment队列中删除
而replace与add的区别就是,它是替换activity的实例,不是直接把fragment直接加到activity上层,它是把activity最上层的fragment替换成它想替换的fragment.