原文链接:https://blog.csdn.net/xiangzhihong8/java/article/details/96280254

3、fragemnt

3.1、创立形式

(1)动态创立

首先咱们须要创立一个xml文件,而后创立与之对应的java文件,通过onCreatView()的返回办法进行关联,最初咱们须要在Activity中进行配置相干参数即在Activity的xml文件中放上fragment的地位。
` <fragment

    android:name="xxx.BlankFragment"    android:layout_width="match_parent"    android:layout_height="match_parent"></fragment>

`
2)动态创建
动态创建Fragment次要有以下几个步骤:

创立待增加的fragment实例。
获取FragmentManager,在Activity中能够间接通过调用 getSupportFragmentManager()办法失去。
开启一个事务,通过调用beginTransaction()办法开启。
向容器内增加或替换fragment,个别应用repalce()办法实现,须要传入容器的id和待增加的fragment实例。
提交事务,调用commit()办法来实现。
3.2、Adapter比照
FragmnetPageAdapter在每次切换页面时,只是将Fragment进行拆散,适宜页面较少的Fragment应用以保留一些内存,对系统内存不会多大影响。

FragmentPageStateAdapter在每次切换页面的时候,是将Fragment进行回收,适宜页面较多的Fragment应用,这样就不会耗费更多的内存

3.3、Activity生命周期
Activity的生命周期如下图:

(1)动静加载:
动静加载时,Activity的onCreate()调用完,才开始加载fragment并调用其生命周期办法,所以在第一个生命周期办法onAttach()中便能获取Activity以及Activity的布局的组件;

(2)动态加载:
1.动态加载时,Activity的onCreate()调用过程中,fragment也在加载,所以fragment无奈获取到Activity的布局中的组件,但为什么能获取到Activity呢?

2.原来在fragment调用onAttach()之前其实还调用了一个办法onInflate(),该办法被调用时fragment曾经是和Activity互相联合了,所以能够获取到对方,然而Activity的onCreate()调用还未实现,故无奈获取Activity的组件;

3.Activity的onCreate()调用实现是,fragment会调用onActivityCreated()生命周期办法,因而在这儿开始便能获取到Activity的布局的组件;
**
3.4、与Activity通信**
fragment不通过构造函数进行传值的起因是因为横屏切换的时候获取不到值。

Activity向Fragment传值:
Activity向Fragment传值,要传的值放到bundle对象里;
在Activity中创立该Fragment的对象fragment,通过调用setArguments()传递到fragment中;
在该Fragment中通过调用getArguments()失去bundle对象,就能失去外面的值。

Fragment向Activity传值:
第一种:
在Activity中调用getFragmentManager()失去fragmentManager,,调用findFragmentByTag(tag)或者通过findFragmentById(id),例如:

`FragmentManager fragmentManager = getFragmentManager();

Fragment fragment = fragmentManager.findFragmentByTag(tag);
`
第二种:
通过回调的形式,定义一个接口(能够在Fragment类中定义),接口中有一个空的办法,在fragment中须要的时候调用接口的办法,值能够作为参数放在这个办法中,而后让Activity实现这个接口,必然会重写这个办法,这样值就传到了Activity中

Fragment与Fragment之间是如何传值的:
第一种:
通过findFragmentByTag失去另一个的Fragment的对象,这样就能够调用另一个的办法了。

第二种:
通过接口回调的形式。

第三种:
通过setArguments,getArguments的形式。

3.5、api区别
add
一种是add形式来进行show和add,这种形式你切换fragment不会让fragment从新刷新,只会调用onHiddenChanged(boolean isHidden)。

replace
而用replace形式会使fragment从新刷新,因为add形式是将fragment暗藏了而不是销毁再创立,replace形式每次都是从新创立。

commit/commitAllowingStateLoss
两者都能够提交fragment的操作,惟一的不同是第二种办法,容许失落一些界面的状态和信息,简直所有的开发者都遇到过这样的谬误:无奈在activity调用了onSaveInstanceState之后再执行commit(),这种异样时能够了解的,界面被零碎回收(界面曾经不存在),为了在下次关上的时候复原原来的样子,零碎为咱们保留界面的所有状态,这个时候咱们再去批改界面实践上必定是不容许的,所以为了防止这种异样,要应用第二种办法。

3.懒加载
咱们常常在应用fragment时,经常会联合着viewpager应用,那么咱们就会遇到一个问题,就是初始化fragment的时候,会连同咱们写的网络申请一起执行,这样十分耗费性能,最现实的形式是,只有用户点开或滑动到以后fragment时,才进行申请网络的操作。因而,咱们就产生了懒加载这样一个说法。

Viewpager配合fragment应用,默认加载前两个fragment。很容易造成网络丢包、阻塞等问题。

在Fragment中有一个setUserVisibleHint这个办法,而且这个办法是优于onCreate()办法的,它会通过isVisibleToUser通知咱们以后Fragment咱们是否可见,咱们能够在可见的时候再进行网络加载。

从log上看setUserVisibleHint()的调用早于onCreateView,所以如果在setUserVisibleHint()要实现懒加载的话,就必须要确保View以及其余变量都曾经初始化完结,防止空指针。
**
应用步骤:**

申明一个变量isPrepare=false,isVisible=false,表明以后页面是否被创立了
在onViewCreated周期内设置isPrepare=true
在setUserVisibleHint(boolean isVisible)判断是否显示,设置isVisible=true
判断isPrepare和isVisible,都为true开始加载数据,而后复原isPrepare和isVisible为false,避免反复加载。

收费获取Android进阶材料点击下方链接

https://shimo.im/docs/tXXKHgdjPYj6WT8d/