推荐腾讯官方的一篇文章
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脱离,并没有释放内存
FragmentStatePagerAdapter viewPager切换时适用于页面较多的情况 ,
源码源码中进行了remove Fragment 操作 释放了内存
2.生命周期
image.png结合activity
image.png
这个图的生命周期暂不确定
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()。
网友评论