一、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&¤tFragment.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。