Fragment详解

推荐腾讯官方的一篇文章
https://mp.weixin.qq.com/s/dUuGSVhWinAnN9uMiBaXgw

1.第五大组件

(1). 原因

fragment 不属于四大组件,有自己的生命后期,动态灵活的加载到activity中,并不是完全独立,需要依赖activity

节约内存,ui切换效果更加舒适

(2).加载Activity的2种方式

静态加载
fragment 直接写入 xml 文件中

动态加载
使用FragmentManager来管理

(3). FragmentPagerAdapter 与 FragmentStatePagerAdapter

FragmentPagerAdapter 适用于页面较少的情况

源码中进行的 detach操作 ,只是UI脱离,并没有释放内存

Fragment详解_第1张图片
源码

FragmentStatePagerAdapter viewPager切换时适用于页面较多的情况 ,

Fragment详解_第2张图片
源码

源码中进行了remove Fragment 操作 释放了内存

2.生命周期

Fragment详解_第3张图片
image.png

结合activity


Fragment详解_第4张图片
image.png

这个图的生命周期暂不确定


Fragment详解_第5张图片
image.png

3.fragment之间的通信

a). 在fragment 中调用 activity中方法

  • getActivity()
  • fragment向activity 中传数据 使用接口
首先,在Fragment中定义接口,并让Activity实现该接口(具体实现省略):
public interface OnFragmentInteractionListener {    void onItemClick(String str);  //将str从Fragment传递给Activity}

在Fragment的onAttach()中,将参数Context强转为OnFragmentInteractionListener对象:
public void onAttach(Context context) {
    super.onAttach(context);
        if (context instanceof OnFragmentInteractionListener) {
        mListener = (OnFragmentInteractionListener) context;
    } else {
                throw new RuntimeException(context.toString()
                + " must implement OnFragmentInteractionListener");
    }
}

并在Fragment合适的地方调用mListener.onItemClick("hello")将”hello”从Fragment传递给Activity

b).在Activity 中调用fragment中的方法

  • 获取Fragment对象,并调用Fragment的方法
Fragment中定义方法:
public void setString(String str) { 
    this.str = str;
}

并在Activity中调用fragment.setString("hello")即可。

  • 可以同样使用接口

c). Fragment之间通信

由于Fragment之间是没有任何依赖关系的,因此如果要进行Fragment之间的通信,建议通过Activity作为中介,不要Fragment之间直接通信。

可以先 getActivity()来获取 activity ,在通过 findFragmentById() 来获取另一个fragment

3.FragmentManager管理器

Fragment 的 replace 、add 、remove 方法
FragmentTransaction有一些基本方法,下面给出调用这些方法时,Fragment生命周期的变化:

  • add(): onAttach()->…->onResume()。
  • remove(): onPause()->…->onDetach()。
  • replace(): 相当于旧Fragment调用remove(),新Fragment调用add()。
  • show(): 不调用任何生命周期方法,调用该方法的前提是要显示的Fragment已经被添加到容器,只是纯粹把Fragment UI的setVisibility为true。
  • hide(): 不调用任何生命周期方法,调用该方法的前提是要显示的Fragment已经被添加到容器,只是纯粹把Fragment UI的setVisibility为false。
  • detach(): onPause()->onStop()->onDestroyView()。UI从布局中移除,但是仍然被FragmentManager管理。
  • attach(): onCreateView()->onStart()->onResume()。

你可能感兴趣的:(Fragment详解)