1. 什么是Fragment:
Fragment,俗称碎片,自Android 3.0开始被引进并大量使用。作为Activity界面的一部分,Fragment的存在必须依附于Activity,并且与Activity一样,拥有自己的生命周期,同时处理用户的交互动作。同一个Activity可以有一个或多个Fragment作为界面内容,并且可以动态添加、删除Fragment,灵活控制UI内容,也可以用来解决部分屏幕适配问题。
2. Fragment为什么被称为第五大组件:
首先Fragment的使用次数是不输于其他四大组件的,而且Fragment有自己的生命周期,比Activity更加节省内存。
3. Fragment生命周期:
从上图可以看到Fragment比Activity多了几个额外的生命周期回调方法:
4. Fragment与Activity之间是如何传值的:
1. Activity向Fragment传值:
步骤:
- 要传的值,放到bundle对象里;
- 在Activity中创建该Fragment的对象fragment,通过调用
fragment.setArguments()
传递到fragment中; - 在该Fragment中通过调用
getArguments()
得到bundle对象,就能得到里面的值。
2. Fragment向Activity传值:
第一种:
在Activity中调用getFragmentManager()得到fragmentManager,,调用findFragmentByTag(tag)或者通过findFragmentById(id)
FragmentManager fragmentManager = getFragmentManager();
Fragment fragment = fragmentManager.findFragmentByTag(tag);
第二种:
通过回调的方式,定义一个接口(可以在Fragment类中定义),接口中有一个空的方法,在fragment中需要的时候调用接口的方法,值可以作为参数放在这个方法中,然后让Activity实现这个接口,必然会重写这个方法,这样值就传到了Activity中
5. Fragment与Fragment之间是如何传值的:
第一种:
通过findFragmentByTag
得到另一个的Fragment的对象,这样就可以调用另一个的方法了。
第二种:
通过接口回调的方式。
第三种:
通过setArguments
,getArguments
的方式。
6. FragmentTransaction的add和replace的区别:
add + hide + show的方式:
其实add是一层层添加上去的,通过show去显示当前界面,hide去隐藏其他的界面,这时候的FrameLayout是会有很多层的。Fragment A 切换到Fragment B,然后再由Fragment B 切换到Fragment A 的时候,Fragment A 的所有生命周期是不会走的,只会调用onHiddenChanged(boolean isHidden)
,也就是说hide和show只是把其他界面隐藏,当前界面显示的效果,并不会走生命周期方法。replace的方式:
其实replace是会替换掉原有的,所以这种方式的FrameLayout是只有一层的,再如上面的方式切换fragment,Fragment A会依次走生命周期方法:onAttach ---> onViewCreated ---> onActivityCreated ---> onStart。
但是如果添加代码ft.addToBackStack(null)
,生命周期方法onAttach
方法就不会走。
7. Fragment如何实现类似Activity的压栈和出栈效果的:
Fragment的事物管理器内部维持了一个双向链表结构,该结构可以记录我们add或者replace的Fragment,然后当我们按返回键的时候,会自动帮我们实现出栈操作。
8. FragmentPagerAdapter与FragmentStatePagerAdapter的区别:
一. 由于FragmentStatePagerAdapter在destoryItem的时候调用mCurTransaction.remove(fragment),会回收内存的,而页面比较多的时候,就比较消耗内存,所以FragmentStatePagerAdapter适合于页面比较多的情况。
二. FragmentPagerAdapter在destoryItem的时候调用mCurTransaction.detach(fragment),没有回收内存,只是将fragment与activity的UI进行分离,所以FragmentPagerAdapter适合于页面比较少的情况。
总结:FragmentPagerAdapter适用于页面较少的情况,FragmentStatePagerAdapter适用于页面较多的情况。
喜欢本篇博客的简友们,就请来一波点赞,您的每一次关注,将成为我前进的动力,谢谢!