Android Fragment的基础知识点

一、Fragment的简介
Fragment可以理解为一个具有自己生命周期的控件,它有自己的处理输入事件的能力和生命周期,但是必须依赖于Activity,能互相通信和托管。
使用Fragment有如下优点:
代码复用。特别适用于模块化的开发,因为一个Fragment可以被多个Activity嵌套,有个共同的业务模块就可以复用了,是模块化UI的良好组件。
Activity用来管理Fragment。Fragment的生命周期是寄托到Activity中,Fragment可以被Attach添加和Detach释放。
可控性。Fragment可以像普通对象那样自由的创建和控制,传递参数更加容易和方便,也不用处理系统相关的事情,显示方式、替换、不管是整体还是部分,都可以做到相应的更改。
Fragment是view controllers,它们包含可测试,解耦的业务逻辑块,由于Fragment是构建在view之上的,而view很容易实现动画效果,因此Fragment在屏幕切换时具有更好的控制。
二、Fragment的生命周期
Fragment的生命周期类似Activity,如下图,Activity生命周期与Fragment生命周期对比图如下:

三、Fragment的两种添加方式
add方式
Fragment的添加与FragmentManager及FragmentTransaction有关,参考如下代码:
public void add(BaseLibFragment fragment , int id,String tag ){
FragmentManager fragmentManager = ((BaseLibActivity)mContext).getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
//优先检查, fragment 是否存在,避免重叠
BaseLibFragment tempFragment = (BaseLibFragment) fragment Manager.findFragmentByTag( tag );
if(EmptyUtils.isNotEmpty(tempFragment)){
fragment = tempFragment;
}
if( fragment .isAdded()){
addOrShowFragment( fragment Transaction, fragment ,id, tag );
}else{
if(currentFragment!=null&&currentFragment.isAdded()){
fragment Transaction.hide(currentFragment).add(id, fragment , tag ).commit();
}else{
fragment Transaction.add(id, fragment , tag ).commit();
}
currentFragment = fragment ;
}
}
/**
* 显示 fragment
* @param fragment
*/
private void addOrShowFragment(FragmentTransaction transaction, BaseLibFragment fragment , int id,String tag ) {
if(currentFragment == fragment )
return;
if (! fragment .isAdded()) { // 如果当前 fragment 未被添加,则添加到Fragment管理器中
transaction.hide(currentFragment).add(id, fragment , tag ).commit();
} else {
transaction.hide(currentFragment).show( fragment ).commit();
}
currentFragment. set UserVisibleHint(false);
currentFragment = fragment ;
currentFragment. set UserVisibleHint(true);
}
程序中的逻辑代码所做的工作是将新增加的Fragment给显示出来。在添加Fragment前,先通过环境变量获取FragmentManager对象,在通过FragmentManager对象得到FragmentTransaction对象,另外还需判断被添加的Fragment对象是否存在。
replace方式
replace方式的参考代码如下:
public void replace (BaseLibFragment fragment, int id){
FragmentManager fragmentManager = ((BaseLibActivity)mContext).getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(id, fragment);
fragmentTransaction.commit();
}
替换方式比较直接,根据id值直接填换就行。
四、FragmentManager几种不同方式的获取
FragmentManager存在三种不同的获取方式getFragment、getSupportFragmentManager和getChildFragmentManager,在实际使用中容易搞混下面对这三种方式进行一下区分。
getFragmentManager:Fragment是Android3.0以后引入的控件,在针对Android3.0以上的版本进行编程时在Activity中直接调用getFragmentManager就可以得到FragmentManager。
getSupportFragmentManager:承上所述,当APK为了兼容Android3.0以下的版本时,Android SDK提供了一个向下的兼容包android.support.v4。在代码中需要将编程Fragment继承的导包 由android.app.Fragment修改为android.support.v4.app.Fragment,另外将控制Fragment的Activity修改为继承自FragmentActivity。
getChildFragMentManager:当Fragment嵌套有Fragment时,需要用getChildFragmentManager来获取Fragment。

猜你喜欢

转载自blog.csdn.net/polo2044/article/details/79829052