Fragment分析
使用sdk中自带的Fragment
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
frameFragment = new FrameFragment();
transaction.replace(R.id.rl_content, frameFragment);
transaction.commit();
使用v4包中的:compile 'com.google.android:support-v4:r7'
要继承FragmentActivity才能使用
android.support.v4.app.FragmentManager manager = getSupportFragmentManager();
android.support.v4.app.FragmentTransaction transaction = manager.beginTransaction();
//这个要继承自 android.support.v4.app.Fragment
FrameFragment frameFragment = new FrameFragment();
transaction.add(R.id.rl_content, frameFragment);
transaction.commit();
FragmentManager的实现类是FragmentManagerImpl,是一个内部类。他在Activity类加载的时候就会初始化
beginTransaction()的时候就是new BackStackRecord(),他的父类是FragmentTransaction,代表一个操纵BackStack的“事务”
add,replace,remove都是将一个Op(operation)对象加入队列
commit是其实调用Activity的handler来post一个Runnable对象,这个对象就是BackStackRecord,然后执行他的run方法
这个run方法中调用的还是FragmentManager中的movetostate方法,add,remove对应的都是fragment.container.addView(),和removeView,同时负责调用fragment生命周期。
可以说BackStackRecord是一次事务的实体,调用他的commit会用handler来调用自己的run方法,里面调用fragmentManager的remove ,add方法,BackStackRecord是负责事务的逻辑,而fragmentManager负责单个的添加和删除逻辑,不负责事务业务。
如果在Activity的oncreate中创建的Fragment
a-onceate()
f-onattach()
f-oncreate()
f-oncreateView()
f-onViewCreated();
f-onActivityCreated()
f-onStart()
a-onstart()
a-onResume()
f-onResume()
上面再Activity的onStart中会调用fragment的执行方法,所以在Activity的onStart之前就会调用fragment方法
如果Activity已经创建再添加Fragment,还是上面同样的生命周期。
销毁Activity周期
f-onpause
a-onpause
f-onstop
a-onstop
f-ondestoryview
f-ondestory
f-ondettach
a-ondestory
另外Fragment也有回退栈,由Activity来管理,这个的作用是适配 back键
transaction.addToBackStack(null);
要重写onBackPress,当然我们不写也行,因为Activity已经帮我们重写了
@Override
public void onBackPressed() {
int backStackEntryCount = getFragmentManager().getBackStackEntryCount();
if (backStackEntryCount > 0) {
getFragmentManager().popBackStack();
} else {
super.onBackPressed();
}
}
比如添加一个,然后删除,back就是添加(这个和刚刚删除的是一个对象,而且这次添加不调用onattach和onCreate),删除
其实fragment原理就是addView,removeView只不过用FragmentManager和FragmentActivity来调用他的生命周期,另外Fragment不一定要有UI,它可以当做逻辑来用,而且平板的适配,或者页面架构的适配用Fragment都是不二之选。