面试题二:Fragment详解

目录

一、Fragment为什么被称为第五大组件?

1、Fragment为什么被称为第五大组件

2、Fragment加载到Activity的两种方式

(1)静态添加,添加Fragment到Activity的布局文件当中

(2)动态添加,在activity中代码添加

3、FragmentPagerAdapter与FragmentStatePagerAdapter区别

二、Fragment的生命周期

三、Fragment之间的通信

四、Fragment管理器:FragmentManager


相关文章:面试题二:组件之Fragment系列

一、Fragment为什么被称为第五大组件?

1、Fragment为什么被称为第五大组件

依附于activity,有自己的生命周期,使用频率不输于其他四大组件。

2、Fragment加载到Activity的两种方式

(1)静态添加,添加Fragment到Activity的布局文件当中

(2)动态添加,在activity中代码添加

              代码如下:

        //步骤一:添加一个FragmentTransaction的实例
        FragmentManager fragmentManager = getFragmentManager();
        //FragmentTransaction 是一个set集合 专门用来管理fragment
        FragmentTransaction transaction = fragmentManager.beginTransaction();

        //步骤二:用add()方法加上Fragment的对象rightFragment
        RightFragment rightFragment = new RightFragment();
        transaction.add(R.id.right_container, rightFragment, "rightFragment");
        transaction.addToBackStack("rightFragment");

        //步骤三:调用commot()方法使得FragmentT人asaction实例的改变生效
        transaction.commit();

另外,关于FragmentTransaction的源码解读请看:当FragmentTransaction在add和replace时,它们之间的区别 

3、FragmentPagerAdapter与FragmentStatePagerAdapter区别

FragmentPagerAdapter适合于Fragment较少的情况,FragmentStatePagerAdapter适合于Fragment较多的情况。

具体分析:我们先来看FragmentPagerAdapter的destroyItem()方法:

@Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        if (mCurTransaction == null) {
            mCurTransaction = mFragmentManager.beginTransaction();
        }
        if (DEBUG) Log.v(TAG, "Detaching item #" + getItemId(position) + ": f=" + object
                + " v=" + ((Fragment)object).getView());
        mCurTransaction.detach((Fragment)object);
    }

在最后一句里,detach只是将fragment与activity分离,并没有销毁fragment,也就是说内存没有被回收。

再来看 FragmentStatePagerAdapter的destroyItem()方法:

@Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        Fragment fragment = (Fragment) object;

        if (mCurTransaction == null) {
            mCurTransaction = mFragmentManager.beginTransaction();
        }
        if (DEBUG) Log.v(TAG, "Removing item #" + position + ": f=" + object
                + " v=" + ((Fragment)object).getView());
        while (mSavedState.size() <= position) {
            mSavedState.add(null);
        }
        mSavedState.set(position, fragment.isAdded()
                ? mFragmentManager.saveFragmentInstanceState(fragment) : null);
        mFragments.set(position, null);

        mCurTransaction.remove(fragment);
    }

最后一句,销毁了fragment,回收了内存。 

二、Fragment的生命周期

三、Fragment之间的通信

1、在Fragment中调用Activity中的方法 getActivity

2、在Activity中调用Fragment中的方法 接口回调

3、在Fragment中调用Fragment中的方法 findFragmentById

四、Fragment管理器:FragmentManager

replace、add、remove方法

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值