照常,我们先看看整体的章节结构/目录
由于Fragment有生命周期(依赖于Activity生命周期),使用频率不输于4大组件,可灵活加载到Activity。
1.加载方式
1.1静态加载
<fragment
android:name="com.example.myfragment.MyFragment"
android:id="@+id/myfragment_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
1.2动态加载
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
//将FragmentA从容器中移除掉,减少内存的消耗
fragmentTransaction.replace(R.id.fragment_layout,new FragmentB());
fragmentTransaction.commit();
通常情况下我们开发应用最常见的使用情况是TabLayout+ViewPager+Fragment的使用方式,这就涉及到两个常用的适配器的使用,一个是FragmentPagerAdapter,另外一个是FragmentStatePagerAdapter,那么它们之间有什么区别呢?其实很简单,FragmentPagerAdapter适用于页面较少的情况,而FragmentStatePagerAdapter适用于页面较多的情况。
2.生命周期
Fragment的生命周期中,主要是依赖于Activity的生命周期,在Fragment创建的时候进行遍历,但是多数只调用一次,目前常用YoKeyword/Fragmentation封装的supportFragment进行使用,其中封装了onHiddenChanged等用于fragment显示/隐藏进行回调。具体的生命周期场景,详见参考博客
3.Fragment的通信
Fragment-》Activity:可以通过getActivity()进行强转,然后调用方法
Activity-》Fragment:可以通过setArgment,或者直接回调Fragment的方法,但是一般采用前者,因为很多时候具有时机问题
Fragment-》Fragment:可以通过中转方式,采用上述两个消息传递的结合
但是,通常最常用的目前采用广播(目前多采用RXBus)进行消息传递(强烈推荐),避免了不少数据时机问题
4.Fragment的切换方式
通常,我们都会在一个Activity里面具有多个fragment进行切换,切换的方式主要有:
4.1 add()&remove():就是添加和移除,我们常见的replace就是采取这种方式,内部就是先remove,然后add。这样每次都会创建新的Fragment实例;
4.2 show()&hide():将其缓存起来,之后通过显示隐藏,该方式常用于频繁切换,但是数目不多时,避免了实例的频繁创建和部分缓存数据的丢失;
4.3 attch()&detach():Fragment实例进行缓存,但是每次将布局视图丢弃,调用onCreateView()来重绘视图,因此每次Fragment.isAdded()方法将返回false(通过view的parent的removeView()方法将view和parent的关联删除后返回),此方式极少使用。
5.Fragment的懒加载
为了在界面加载成功后再进行数据获取,避免缓存压力,有时候需要进行懒加载的操作。但是结合ViewPager使用中,FragmentPagerAdapter里最少缓存两个Fragment,mViewPager.setOffscreenPageLimit(0);/设置缓存view 的个数,是无效的,因为它里面有判断,最小为1。如果为了完全达成懒加载状态,则需要另一个策略。
首先,fragment里有一个方法优先于OnCreat()回调方法——setUserVisibleHint ,我们可以在这个方法进行判断和数据拉取,但是此时有容易遇到UI未加载。所以一般我们可以在onStart()方法里采用if(getUserVisibleHint()) 进行判断和加载数据。
---------------------
参考博文:
作者:ClAndEllen 来源:CSDN 题目:Android面试系列文章2018之Android部分Fragment篇
链接:https://blog.csdn.net/clandellen/article/details/79269680
---------------------