Android小知识-Fragment

转载请标明出处:【顾林海的博客】

个人开发的微信小程序,目前功能是书籍推荐,后续会完善一些新功能,希望大家多多支持!
在这里插入图片描述

##前言
今天还是总结下Android中的小知识点Fragment,Fragment使用广泛,有自己的生命周期(必须依附Activity),动态灵活的加载到Activity中去,Android 3.0 引入,常用模式有Fragment+ViewPager。


Fragment加载到Activity的两种方式

  • 添加Fragment到Activity的布局文件当中。
  • 在Activity的代码中动态添加Fragment。

第一种方式虽然简单但灵活性不够。添加Fragment到Activity的布局文件当中,就等同于将Fragment及其视图与activity的视图绑定在一起,且在activity的生命周期过程中,无法切换fragment视图。

第二种方式比较复杂,但也是唯一一种可以在运行时控制fragment的方式(加载、移除、替换)。

第二种方式代码如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/background">

    <FrameLayout
        android:id="@+id/id_fl_homepage"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@id/id_bottom_menu" />
</RelativeLayout>
    private static Fragment mContentFragment;

    /**
     * Fragment的切换
     *
     * @param fragment Fragment
     */
    private void switchFragment(Fragment fragment) {
        if (mContentFragment != fragment) {
            FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
            fragmentTransaction.hide(mContentFragment);
            if (fragment.isAdded()) {
                fragmentTransaction.show(fragment);
            } else {
                fragmentTransaction.add(R.id.id_fl_homepage, fragment);
            }
            fragmentTransaction.commitAllowingStateLoss();
            mContentFragment = fragment;
        }
    }

FragmentPagerAdapter与FragmentStatePagerAdatper区别

FragmentPagerAdapter适用于页面较少的情况下,FragmentStatePagerAdapter适用于页面较多的情况下。

查看FragmentStatePagerAdapter源码:

    @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);
        //真正的释放了Fragment内存。
        mCurTransaction.remove(fragment);
    }

重点在最后一行,mCurTransaction.remove(fragment);表示释放了Fragment内存。

再查看FragmentPageAdapter源码:

    @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);
    }

同样看最后一行调用了FragmentTransaction的detach方法,detach方法只是将Fragment UI和Activity UI脱离开,并不会回收内存。

Fragment生命周期

Fragment不是独立,它依附于Activity,

Fragment与Activity生命周期对比图:

Fragment之间的通信

  • 在Fragment中调用Activity中的方法: getActivity。
  • 在Activity中调用Fragment中的方法: 接口回调。
  • 在Fragment中调用Fragment中的方法: findFragmentById

Fragment管理器:FragmentManager

FragmentManager方法:replace、add、remove。

replace作用是替换Fragment实例,add作用是添加Fragment实例,remove移除Fragment。

©️2020 CSDN 皮肤主题: 猿与汪的秘密 设计师:上身试试 返回首页