Fragment分析

2017-10-06  本文已影响9人  popli

使用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都是不二之选。

上一篇 下一篇

猜你喜欢

热点阅读