Fragment相关总结
Fragment为什么被称为第五大组件
fragment为什么被称为第五大组件
1.Fragment应用范围广
2.Fragment具有自己的生命周期
3.可以动态加载到Activity
Fragment相比Activity更节省内存,UI切换效果更舒适。
Fragment加载到Activity的两种方式
1.静态加载
添加Fragment到Activity的布局文件当中。
2.动态加载
//步骤一:添加FragmentTransaction实例
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction transaction = fragmentManger.beginTransaction();
//步骤二:用add()方法加上自定义的rightFragment对象
RightFragment rightFragment = new RightFragment();
transaction.add(R.id.right_continer, rightFragment, "rightFragment");
transaction.addToBackStack("rightFragment");
//步骤三:调用commit()方法是的FragmentTransaction实例的改变生效。
transaction.commit();
FragmentPageAdapter 与 FragmentStatePagerAdapter 区别
Fragment常与ViewPager组合使用。
FragmentPageAdapter 适用于页面较少的情况
FragmentStatePagerAdapter 适用于页面较多的情况
//FragmentStatePagerAdapter.java
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull 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);
if (fragment == mCurrentPrimaryItem) {
mCurrentPrimaryItem = null;
}
}
在 FragmentStatePagerAdapter 的destroyItem方法中,最后调用mCurTransaction.remove(fragment);
说明FragmentStatePagerAdapter最后是真正释放了fragment
也就是说 FragmentStatePagerAdapter 比 FragmentPageAdapter 更节省内存。
//FragmentPageAdapter.java
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
Fragment fragment = (Fragment) object;
if (mCurTransaction == null) {
mCurTransaction = mFragmentManager.beginTransaction();
}
if (DEBUG) Log.v(TAG, "Detaching item #" + getItemId(position) + ": f=" + object
+ " v=" + (fragment.getView()));
mCurTransaction.detach(fragment);
if (fragment == mCurrentPrimaryItem) {
mCurrentPrimaryItem = null;
}
}
mCurTransaction.detach(fragment);
detach意味着并不是真正的内存回收,只是把fragment的ui和Activity的ui脱离开来。并不回收内存。
Fragment的生命周期
官方的fragment生命周期图:
Fragment与Activity交互的生命周期图:
onAttach(): Fragment与Activity关联之后回调的。
onCreate(): 初次创建Fragment时调用。这个方法只是用来创建Fragment,此时Activity并没有创建完成。
onCreateView(): Fragment首次绘制用户界面时会调用这个方法。如果想要为Fragment绘制UI,那么该方法返回的view必须是Fragment的根视图view.
onViewCreated(): 表明Fragment的界面UI已经绘制好了。此时可以初始化Fragment里面的控件资源。
onActivityCreated(): 表示activity的onCreate已经完毕
onStart(): activity可见之后,才会调用Fragment的onStart()方法,表示Fragment可见了。
onResume(): activity与用户可交互之后,Fragment调用onResume表示可以与用户交互了。
onPause(): 不可交互
onStop(): 不可见
onDestroyView(): 和onCreateView()方法对应,表示Fragment即将结束。
onDestroy(): fragment不再被使用了。
onDetach(): fragment对象销毁。
Fragment之间的通信
Fragment与activity之间的通信
在fragment中调用activity的方法,只需要调用getActivity()就可以获取到activity的实例,调用activity的方法。
Fragment与Fragment之间的通信
首先可以通过getActivity()获取activity的方法。然后通过findFragmentById 获取到activity所对应的另外一个fragment的方法。
activity与Fragment之间的通信
在activity中调用fragment的方法,常用的是接口回调。
在fragment中创建接口,由activity来实现,这样就可以做到在activity中调用fragment的方法。
Fragment管理器:FragmentManager
FragmentManager的三个方法:replace、add、remove
add : 将一个Fragment的实例添加到activity的fragment队列最上层。
remove:将fragment实例从activity的fragment队列中删除。
replace:将activity最上层的fragment替换成他想替换的fragment