Fragment相关总结

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

fragment为什么被称为第五大组件

1.Fragment应用范围广

2.Fragment具有自己的生命周期

3.可以动态加载到Activity

image

Fragment相比Activity更节省内存,UI切换效果更舒适。

Fragment加载到Activity的两种方式

1.静态加载
添加Fragment到Activity的布局文件当中。

2.动态加载

//步骤一:添加FragmentTransaction实例
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction transaction = fragmentManger.beginTransaction();

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

//步骤三:调用commit()方法是的FragmentTransaction实例的改变生效。
transaction.commit();

FragmentPageAdapter 与 FragmentStatePagerAdapter 区别

Fragment常与ViewPager组合使用。

FragmentPageAdapter 适用于页面较少的情况
FragmentStatePagerAdapter 适用于页面较多的情况

    //FragmentStatePagerAdapter.java
    @Override
    public void destroyItem(@NonNull ViewGroup container, int position, @NonNull 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);
        if (fragment == mCurrentPrimaryItem) {
            mCurrentPrimaryItem = null;
        }
    }

在 FragmentStatePagerAdapter 的destroyItem方法中,最后调用mCurTransaction.remove(fragment);说明FragmentStatePagerAdapter最后是真正释放了fragment
也就是说 FragmentStatePagerAdapter 比 FragmentPageAdapter 更节省内存。

    //FragmentPageAdapter.java
    @Override
    public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
        Fragment fragment = (Fragment) object;

        if (mCurTransaction == null) {
            mCurTransaction = mFragmentManager.beginTransaction();
        }
        if (DEBUG) Log.v(TAG, "Detaching item #" + getItemId(position) + ": f=" + object
                + " v=" + (fragment.getView()));
        mCurTransaction.detach(fragment);
        if (fragment == mCurrentPrimaryItem) {
            mCurrentPrimaryItem = null;
        }
    }

mCurTransaction.detach(fragment);detach意味着并不是真正的内存回收,只是把fragment的ui和Activity的ui脱离开来。并不回收内存。

Fragment的生命周期

官方的fragment生命周期图:

Fragment与Activity交互的生命周期图:

onAttach(): Fragment与Activity关联之后回调的。

onCreate(): 初次创建Fragment时调用。这个方法只是用来创建Fragment,此时Activity并没有创建完成。

onCreateView(): Fragment首次绘制用户界面时会调用这个方法。如果想要为Fragment绘制UI,那么该方法返回的view必须是Fragment的根视图view.

onViewCreated(): 表明Fragment的界面UI已经绘制好了。此时可以初始化Fragment里面的控件资源。

onActivityCreated(): 表示activity的onCreate已经完毕

onStart(): activity可见之后,才会调用Fragment的onStart()方法,表示Fragment可见了。

onResume(): activity与用户可交互之后,Fragment调用onResume表示可以与用户交互了。

onPause(): 不可交互

onStop(): 不可见

onDestroyView(): 和onCreateView()方法对应,表示Fragment即将结束。

onDestroy(): fragment不再被使用了。

onDetach(): fragment对象销毁。

Fragment之间的通信

Fragment与activity之间的通信

在fragment中调用activity的方法,只需要调用getActivity()就可以获取到activity的实例,调用activity的方法。

Fragment与Fragment之间的通信

首先可以通过getActivity()获取activity的方法。然后通过findFragmentById 获取到activity所对应的另外一个fragment的方法。

activity与Fragment之间的通信

在activity中调用fragment的方法,常用的是接口回调。
在fragment中创建接口,由activity来实现,这样就可以做到在activity中调用fragment的方法。

Fragment管理器:FragmentManager

FragmentManager的三个方法:replace、add、remove

add : 将一个Fragment的实例添加到activity的fragment队列最上层。

remove:将fragment实例从activity的fragment队列中删除。

replace:将activity最上层的fragment替换成他想替换的fragment

posted @ 2022-07-05 20:43  cfdroid  阅读(29)  评论(0编辑  收藏  举报