Fragment(碎片)可以理解为activity中界面的一部分,我们可以将多个fragment组合起来放到activity中,或者在多个activity中重用一个fragment。
一、Fragment为什么被称为第五大组件?
首先在使用频率上,fragment不低于其他四大组件,而且它有自己的生命周期。使用fragment比activity更加节省内存,同时,它可以很灵活的加载到activity中,所以它被称为第五大组件。虽然它有自己的生命周期,但是它必须依附于宿主activity存在。
二、Fragment加载到activity中的两种方式?
- 静态加载:在activity的布局文件中以标签的形式添加fragment。
- 动态加载:在java文件中以代码的形式加载fragmet。
- 1、获取FragmentManager管理者对象;
- 2、通过上述对象的beginTranscation()方法创建FragmentTranscation对象;
- 3、通过transcation对象的add()/remove()/replace()/hide()/show()等方法来显示或者移除fragment;
- 4、通过transcation对象的commit()方法来提交。
总结起来就是如下两行代码:
getFragmentManager().beginTranscation().add()
getFragmentManager().beginTranscation().commit()
注意:
1、同一个fragment只能被add一次;
2、同一个transcation只能被提交一次;
3、transcation.addToBackStack(null)将碎片添加到返回栈中,此时按下返回键,不会退出程序,而是返回上一个碎片。
三、fragmentPagerAdapter和fragmentStatePagerAdapter的区别?
fragmentPagerAdapter在destroyItem()的时候调用的是detach()方法,只是把UI进行了分离,并没有真正的移除fragment,所以只适用于页面较少的情况。而fragmentStatePagerAdapter在切换页面的时候调用的是remove()方法,是真正回收内存的,所以它适用于页面较多的情况。
四、fragment的生命周期?
onAttach()–>onCreate()–>onCreateView()–>onViewCreate()–>activity.onCreate()–>onActivityCreate()–>activity.onStart()–>activity.onResume()–>activity.onPause()–>activity.onStop()–>onDestroyView()–>onDetach()
五、fragment与activity之间的传值通信?
1、fragment向activity之间的传值:
- 在fragment中通过getActivity()获取activity的对象,然后调用activity中的方法;
- 接口回调:在fragment中设置一个接口,然后让activity实现这个接口,这样就可以在接口中将数据传递给activity.
2、activity向fragment传值:
- 在 activity中创建Bundle数据包,通过putExtra()方法将数据放进去,然后调用fragment对象的setArguments(bundle)方法,在fragment中就可以通过getArguments()方法获取数据。
- 在activity中通过getFragmentManager.findFragmentById()获取fragment对象,然后就可以调用fragment的方法了。
3、fragment与fragment传值:
- 在第一个fragment中调用getActivity().getFragmentManager().findFragmentById()获取第二个fragment的对象,然后调用第二个fragment中的方法;
- 接口回调:在fragment1中设置一个接口,宿主activity实现这个接口,fragment1在接口中与activity实现通信,然后在activity中的回调方法中,实现与fragment2的通信。
总结:fragment与activity通信的关键点就是要拿到对方的对象,fragment通过getActivity()获取activity的对象,activity通过getFragmentManager().getFragmentById()来获取fragment对象。fragment与activity之间可以直接通信,而fragment之间必须通过activity这个宿主来实现通信。
最后再说几句
实际开发中,fragment一般用于主界面的tab切换,我们一般用一个ArrayList集合来存放我们想要显示的所有fragment,然后通过transcation的show()方法来显示我们想要的fragment,通过transcation的hide()方法来隐藏其他的fragment。
关于fragment的面试题基本上就是这么多了,如果还有我没有注意到的,欢迎大家给我留言告诉我,我会实时进行更新。(^▽^)