什么是Fragment
Fragment是一种具有生命周期的控件,可以理解为轻量级的Activity,它必须依附于Activity才可以使用。
生命周期
如下图,可以看到Fragment的生命周期是和Activity的生命周期有关联的,
当正常启动一个包含Fragment的Activity,首先是Activity的onCreate,之后才会开始add我们的Fragment:先是Fragment的onAttach->onCreate->onCreateView->onActivityCreated,然后是Activity的onStart–>Fragment的onStart–>Activity的onResume–>Frament的onResume这样下来Fragment就可以使用了。
当正常关闭一个包含Fragment的Activity,则是:Activity的onPause–>Fragment的onPause,Activity的onStop–>FragmentonStop,以及最后Activity 的onDestroy之后,Fragment的onDestroyView->onDestroy->onDetach解除关联。
Fragment的添加使用
Fragment需要在Activity中调用FragmentManager来管理Fragment,引用一段话
使用3.0以上系统获取FragmentManager使用getFragmentManager();使用3.0以下系统获取FragmentManager使用getSupportFragmentManager()。
Fragmet在使用时是有两个包的,分别是app包和v4包。v4包主要用来兼容低版本系统也能正常显示Fragment,而app包在安卓4.2系统之前的设备运行Fragment时,程序会崩溃。因此我们一般使用Fragment都选择使用v4包中的Fragment以确保低版本的系统运行正常。
原文链接:https://blog.youkuaiyun.com/tahlia_/article/details/77970377
所以说在使用V4包下的Fragment就需要在Activity调用getSupportFragmentManager来管理Fragment:
1.add添加Fragment
public void addFrgt(Fragment frgt,int resId)
FragmentManager frgtManager = getFragmentManager() // v4包则用getSupportFragmentManager
FragmentTransaction transaction = frgtManager.beginTransatcion();//开启事务
if(frgt==null){
frgt=new Fragment();
transaction.add(resId,frgt);
}
/*if(otherFrgt!=null){
transaction.hide(otherFrgt);
//如果有多个Fragment切换,那则需要隐藏其他的Fragment而显示当前Fragment
}*/
transaction.show(frgt);
transaction.commit();//提交事务
2.replace添加Fragment
public void replaceFrgt(Fragment fragment, int id){
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction frgtTransaction = fragmentManager.beginTransaction();
frgtTransaction.replace(id, fragment);
frgtTransaction.commit();
}
这两种方法(add和replace)的区别:
add方法是添加Fragment至布局容器,add()第一次添加Fragment 的生命周期:onAttach->onCreate->onCreateView->onActivityCreated->onStart->onResume,重复添加可利用FragmentTransaction的hide/show来隐藏/显示该Fragment,不会重新执行生命周期。
而replace方法每次创建都会重新创建,它会remove掉旧Fragment再 add新Fragment,所以每次调用replace()时Fragment的生命周期为:onPause->onStop->onDestroyView->onDestroy->onDetach(旧的Fragment.remove())–>(新的Fragment.add())onAttach->onCreate->onCreateView->onActivityCreated->onStart->onResume。
所以replace的资源消耗是比较大的,如果又经常需要用到的Fragment应该使用add方法。