Fragment简介

简介: Fragment简介

创建方式

静态创建

静态创建
首先我们需要创建一个xml文件,然后创建与之对应的java文件,通过onCreatView()的返回方法进行关联,最后我们需要在Activity中进行配置相关参数即在Activity的xml文件中放上fragment的位置。
<fragment
        android:name="xxx.BlankFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
</fragment>

首先我

动态创建

动态创建
  1.创建待添加的fragment实例。
  2.获取FragmentManager,在Activity中可以直接通过调用 getSupportFragmentManager()方法得到。
  3.开启一个事务,通过调用beginTransaction()方法开启。
  4.向容器内添加或替换fragment,一般使用repalce()方法实现,需要传入容器的id和待添加的fragment实例。
  5.提交事务,调用commit()方法来完成

Fragment和Activity的生命周期

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

静态加载时,Activity的onCreate()调用过程中,fragment也在加载,所以fragment无法获取到Activity的布局中的组件,但为什么能获取到Activity呢?原来在fragment调用onAttach()之前其实还调用了一个方法onInflate(),该方法被调用时fragment已经是和Activity相互结合了,所以可以获取到对方,但是Activity的onCreate()调用还未完成,故无法获取Activity的组件。Activity的onCreate()调用完成时,fragment会调用onActivityCreated()生命周期方法,因此在这儿开始便能获取到Activity的布局的组件。

Activity向Fragment传值

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

ragment向Activity传值

1、第一种:
在Activity中调用getFragmentManager()得到fragmentManager,,调用findFragmentByTag(tag)或者通过findFragmentById(id),例如:
FragmentManager fragmentManager = getFragmentManager();
Fragment fragment = fragmentManager.findFragmentByTag(tag);

2、第二种:
通过回调的方式,定义一个接口(可以在Fragment类中定义),接口中有一个空的方法,在fragment中需要的时候调用接口的方法,值可以作为参数放在这个方法中,然后让Activity实现这个接口,必然会重写这个方法,这样值就传到了Activity中

Fragment与Fragment之间是如何传值的

// Fragment与Fragment之间是如何传值的
1、通过findFragmentByTag得到另一个的Fragment的对象,这样就可以调用另一个的方法了;
2、通过接口回调的方式;
3、通过setArguments,getArguments的方式

Fragment和Adapter对比

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


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

懒加载

// 懒加载
我们经常在使用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,防止重复加载。

Fragment家族常用API

.add()

.add()
往Activity中添加一个Fragment,这种方式切换fragment不会让fragment重新刷新,只会调用onHiddenChanged(boolean isHidden)

.remove()

.remove()
从Activity中移除一个Fragment,如果被移除的Fragment没有添加到回退栈(回退栈后面会详细说)

.replace()

.replace()
使用另一个Fragment替换当前的,实际上就是remove()然后add()的合体,这种方式会使fragment重新刷

.hide()

.hide()
当你的fragment数量固定很少时隐藏当前的Fragment,仅仅是设为不可见,并不会销毁,多的时候可能出

.show()

.show()
显示之前隐藏的Fragment

.commit()/.commitAllowingStateLoss()

.commit()/.commitAllowingStateLoss()
两者都可以提交fragment的操作,唯一的不同是第二种方法,允许丢失一些界面的状态和信息,几乎所
目录
相关文章
|
9月前
|
Android开发
Android基础知识:什么是Fragment?与Activity的区别是什么?
Android基础知识:什么是Fragment?与Activity的区别是什么?
1505 54
|
前端开发
前端学习案例3-fragment之3
前端学习案例3-fragment之3
62 0
前端学习案例3-fragment之3
|
前端开发
前端学习案例2-fragment之2
前端学习案例2-fragment之2
72 0
前端学习案例2-fragment之2
|
前端开发
前端学习案例2-_fragment
前端学习案例2-_fragment
75 0
前端学习案例2-_fragment
|
前端开发
前端学习案例1-fragment之1
前端学习案例1-fragment之1
79 0
前端学习案例1-fragment之1
|
开发工具 Android开发
XPage 一个非常方便的Android Fragment页面框架
XPage 一个非常方便的Android Fragment页面框架
867 0
XPage 一个非常方便的Android Fragment页面框架
|
ARouter 安全 API
XRouter 一个轻量级的Android路由框架,基于ARouter上进行改良,优化Fragment的使用,可结合XPage使用
XRouter 一个轻量级的Android路由框架,基于ARouter上进行改良,优化Fragment的使用,可结合XPage使用
851 0
XRouter 一个轻量级的Android路由框架,基于ARouter上进行改良,优化Fragment的使用,可结合XPage使用
|
XML 数据库 Android开发
Navigation之详细聊聊Fragment的实现原理
Navigation之详细聊聊Fragment的实现原理
Navigation之详细聊聊Fragment的实现原理
DHL
|
存储 算法 安全
[译][Google工程师] 刚刚发布了 Fragment 的新特性 “Fragment 间传递数据的新方式” 以及源码分析
[译][Google工程师] 刚刚发布了 Fragment 的新特性 “Fragment 间传递数据的新方式” 以及源码分析
DHL
196 0
[译][Google工程师] 刚刚发布了 Fragment 的新特性 “Fragment 间传递数据的新方式” 以及源码分析
|
前端开发 Android开发
Flutter 33: 图解自定义 View 之 Paint
0 基础学习 Flutter,第三十三步:自定义 View 第一节~
2540 0