目录
(1)静态添加,添加Fragment到Activity的布局文件当中
3、FragmentPagerAdapter与FragmentStatePagerAdapter区别
相关文章:面试题二:组件之Fragment系列
一、Fragment为什么被称为第五大组件?
1、Fragment为什么被称为第五大组件
依附于activity,有自己的生命周期,使用频率不输于其他四大组件。
2、Fragment加载到Activity的两种方式
(1)静态添加,添加Fragment到Activity的布局文件当中
(2)动态添加,在activity中代码添加
代码如下:
//步骤一:添加一个FragmentTransaction的实例
FragmentManager fragmentManager = getFragmentManager();
//FragmentTransaction 是一个set集合 专门用来管理fragment
FragmentTransaction transaction = fragmentManager.beginTransaction();
//步骤二:用add()方法加上Fragment的对象rightFragment
RightFragment rightFragment = new RightFragment();
transaction.add(R.id.right_container, rightFragment, "rightFragment");
transaction.addToBackStack("rightFragment");
//步骤三:调用commot()方法使得FragmentT人asaction实例的改变生效
transaction.commit();
另外,关于FragmentTransaction的源码解读请看:当FragmentTransaction在add和replace时,它们之间的区别
3、FragmentPagerAdapter与FragmentStatePagerAdapter区别
FragmentPagerAdapter适合于Fragment较少的情况,FragmentStatePagerAdapter适合于Fragment较多的情况。
具体分析:我们先来看FragmentPagerAdapter的destroyItem()方法:
@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);
}
在最后一句里,detach只是将fragment与activity分离,并没有销毁fragment,也就是说内存没有被回收。
再来看 FragmentStatePagerAdapter的destroyItem()方法:
@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);
}
最后一句,销毁了fragment,回收了内存。
二、Fragment的生命周期
三、Fragment之间的通信
1、在Fragment中调用Activity中的方法 getActivity
2、在Activity中调用Fragment中的方法 接口回调
3、在Fragment中调用Fragment中的方法 findFragmentById
四、Fragment管理器:FragmentManager
replace、add、remove方法