一、Fragment为什么被称为第五大组件?
首先在使用频率上,fragment不低于其他四大组件,而且它有自己的生命周期。使用fragment比activity更加节省内存,同时,它可以很灵活的加载到activity中,fragment切换更加舒适,所以它被称为第五大组件。虽然它有自己的生命周期,但是它必须依附于宿主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()
三、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这个宿主来实现通信。