欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Fragment知识小结

程序员文章站 2022-04-08 16:43:06
...

前言:

本博客是对fragment基本面试知识的一个小结,有需要对fragment更深入详细的推荐鸿洋大神的博文 Android Fragment 真正的完全解析。该博客复制参考了Hensen_,感谢原文博主的分享,在前人的基础上做了补充,方便后期知识的回顾。

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

Fragment比Activity更节省内存,其切换模式也更加舒适,使用频率不低于四大组件,且有自己的生命周期,而且必须依附于Activity。

2、Activity创建Fragment的方式

  • 静态创建:

    <fragment
        android:id="@+id/my_fragment"
        android:name="com.example.ling.myreview.MyFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />
  • 动态创建

        FragmentManager fm = getSupportFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();
        ft.add(R.id.fl_content, new MyFragment());
        ft.commit();

3、FragmentPageAdapter和FragmentPageStateAdapter的区别

[1] FragmentPageAdapter:

  • 在每次切换页面的的时候,是将Fragment进行分离,适合页面较少的Fragment使用以保存一些内存,对系统内存不会多大影响.

  • 源码:

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        if (mCurTransaction == null) {
            mCurTransaction = mFragmentManager.beginTransaction();
        }
        // 我们可以看到每次切换Fragment时,Fragment会detach掉,并不会销毁。
        mCurTransaction.detach((Fragment)object);
    }

[2] FragmentPageStateAdapter

  • 在每次切换页面的时候,是将Fragment进行回收,适合页面较多的Fragment使用,这样就不会消耗更多的内存.

  • 源码

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        Fragment fragment = (Fragment) object;
          if (mCurTransaction == null) {
            mCurTransaction = mFragmentManager.beginTransaction();
        }
    
        while (mSavedState.size() <= position) {
            mSavedState.add(null);
        }
        mSavedState.set(position, fragment.isAdded()
                ? mFragmentManager.saveFragmentInstanceState(fragment) : null);
        mFragments.set(position, null);
    
        // 我们可以看到每次切换Fragment时,Fragment会被移除销毁掉。
        mCurTransaction.remove(fragment);
    }

4、Fragment生命周期

fragment 单独的生命周期

  • onAttach(): fragment与activity关联之后的调用。
  • onCreate(): 初次创建fragment时调用。
  • onCreateView(): fragment首次绘制界面时调用,将显示该方法返回的View组件。
  • onActivityCreated(): fragment所在的activity被启动完成时调用。
  • onStart(): fragment可见的时候调用。
  • onResume(): fragment可交互时调用。
  • onPause(): fragment失去焦点不可交互时调用。
  • onStop(): fragment不可见时调用。
  • onDestroyView(): fragment销毁UI界面时调用。
  • onDestroy(): fragment销毁时调用。
  • onDetach(): fragment从activity中解除关联、删除、替换完成时调用。

fragment与Activity的生命周期交互

Fragment知识小结

5、Fragment的通信

  • Fragment调用Activity中的方法:
    1.通过getActivity()获取Activity对象进行操作。

  • Activity调用Fragment中的方法:

    1、接口回调。在fragment中创建回调接口,Activity实现接口监听。
    2、获取fragment实例对象,进行操作。

  • Fragment调用Fragment中的方法:
    1、 FragmentManager.findFragmentById
    2、FragmentManager() .findFragmentByTag

    // 获取fragment实例,进行操作
    Fragment fragment = getActivity().getSupportFragmentManager()
                            .findFragmentByTag("xxxxx");

6、Fragment的replace、add、remove方法

  • replace:替代Fragment的栈顶页面
  • add:添加Fragment到栈顶页面
  • remove:移除Fragment栈顶页面
相关标签: 博客 回顾