一、fragment为什么被称为第五大组件
Android四大组件包括,Activity、Service、Broadcast Receiver、Content Provider,而Fragmnet不仅具有自己的生命周期,而且使用的频率也很突出,它能够灵活的加载到Activity中去,所以也有称Fragment为第五大组件的说法。
二、Fragment加载到Activity的方式
1、静态加载,将Fragment通过<fragment>标签加入到xml文件中。从而实现静态加载Fragment到Activity中去。
2、动态加载步骤:
1获取FragmentManager对象,通过FragmentManager的beginTransaction()方法获取FragmentTransaction对象。
2调用add()方法,添加Fragment对象
3调用FragmentTransaction的commit()方法,提交事务
三、FragmentPagerAdapter和FragmentStatePagerAdapter的区别
我们主要关注他们的destroyItem的方法,我们先看源码再看结论:
FragmentPagerAdapter
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
if (mCurTransaction == null) {
mCurTransaction = mFragmentManager.beginTransaction();
}
if (DEBUG) Log.v(TAG, "Detaching item #" + getItemId(position) + ": f=" + object
+ " v=" + ((Fragment)object).getView());
mCurTransaction.detach((Fragment)object);
}
在FragmentPagerAdapter 最后他是调用了FragmentTransaction的detach方法,它只是分离了Fragment和Activity,并没有对Fragment进行回收内存
FragmentStatePagerFragment
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
Fragment fragment = (Fragment) object;
if (mCurTransaction == null) {
mCurTransaction = mFragmentManager.beginTransaction();
}
if (DEBUG) Log.v(TAG, "Removing item #" + position + ": f=" + object
+ " v=" + ((Fragment)object).getView());
while (mSavedState.size() <= position) {
mSavedState.add(null);
}
mSavedState.set(position, fragment.isAdded()
? mFragmentManager.saveFragmentInstanceState(fragment) : null);
mFragments.set(position, null);
mCurTransaction.remove(fragment);
}
FragmentStatePagerFragment在destroyItem的方法中,它调用了FragmentTransaction的remove方法,对Fragment进行了销毁和回收内存。
所以我们来总结一下面试如何回答这个问题:
FragmentPagerAdapter适用于页面较少的情况,它的destroItem方法只是对Fragment和Activity进行分离,没有对Fragment回收内存,而FragmentStatePagerAdapter适用与页面较多的情况,它会调用remove方法对Fragment回收内存。
四、Fragment生命周期:
onAttach
当Fragment与Activity发生关联时调用。
onCreate
初次创建Fragment调用,创建Fragment,此时Fragment还未创建完成
onCreateView
创建该Fragment的视图
onViewCreated
在Fragment被绘制后,调用此方法,可以初始化控件资源。
onActivityCreated
当Activity的onCreate方法返回时调用
onStart
在Activity的onStart调用后调用,表示Fragment可见了
onResume
在Activity的onResume调用后调用Fragment的onResume方法,此时Fragment可与用户交互
onPause
表示Fragment不可与用户交互
onStop
表示Fragment不可见
onDestoryView
与onCreateView想对应,当该Fragment的视图被移除时调用
onDestory
表示Fragment被销毁
onDetach
与onAttach相对应,当Fragment与Activity关联被取消时调用
五、Fragment通信
1、在Fragment中调用Activity方法
通过getActivity获取Activity的实例,调用其方法
2、在Activity中调用Fragment方法
使用接口回调的方式调用。
3、在Fragment调用其它Fragment的方法
通过getActivity方法获取activity的实例,然后调用findFragmentById的方法获取Fragment对象,调用其方法。
Android面试相关视频资料可加群392626956免费索取。