Fragment基础 | 青训营笔记

129 阅读5分钟

Fragment基础|青训营笔记

这是我参与[第四届青训营]笔记创作活动的第7天

前言

今天我们就来介绍一下Android在3.0中引用的fragment,它诞生主要目的是支持在大屏幕上使用更加动态,更灵活的界面设计方案。因此在涉及到大屏幕的应用开发时,我们就可以优先考虑使用fragment去实现参考下图,接下来就让正式进入正文吧,相信你一定会收获一下fragment的知识。

image-20220815202842548.png

1.什么是Fragment

Fragment是activity中的行为或者界面的一部分,你可以在activity中组合多个fragment,从而构建出一个更为复杂的界面,它也拥有着自己的生命周期,你也可以在activity运行时将其加入或者删除。fragment必须始终托管在activity中,activity的生命周期也会影响其生命周期,例如:当activity暂停时,activity的中所有fragment也会暂停,当activity被销毁时,所有的fragment也会被销毁。

2.Fragment的生命周期

接下来就着重介绍一下fragment的生命周期了,首先我们来看张图,看起来是不是很像activity的生命周期😆

image-20220815203744930.png

来介绍下其独特于activity的函数的作用吧

onAttach():在Fragment与 Activity 建立关联时进行调用

onCreatView():系统会在第一次创建Fragment时将会调用该方法,调用它可以创建于与Fragment绑定的视图

onActivityCreated():当与Fragment相关联的的onCreate()方法返回时调用

onDestroyView():在移除与Fragment相关联的视图层次结构时调用

onDetach:在取消Fragment与Activity的关联是调用

接下来就通过代码的形式,更直观的感受一下Fragment的生命周期吧

打开主界面,fragment生命周期如下所示

image-20220816154026000.png

返回应用程序界面

image-20220816154104492.png

再重新进入主界面

image-20220816154135106.png

最后退出程序

image-20220816154206159.png

是不是,对于其生命周期有了一个全新理解了。但还有一张图,也需要大家去理解

image-20220816154428177.png

毕竟fragment是寄宿在activity中,那么activity的生命周期也就会对其生命周期产生一定的影响了。在这里我就带大家用代码去感受这张图的魅力了。我就简单的说一下吧

Fragment ==>F,Activity ==> A

打卡界面时

F onCreate ==> F onCreateView ==> A onCreate ==> F onActivityCreated ==> A onStart ==> F onStart ==> A onResume ==> F onResume

返回应用程序界面

F onPause ==> A onPause ==> F onStart ==> A onResume ==> F onResume

再重新进入主界面

A onRestart ==> A onStart ==> F onStart ==> A onResume ==> F onResume

最后退出程序

F onPause ==> A onPause ==> F onStop ==> A onStop ==> F onDestroyView ==> F onDestroy ==> F onDetach == A onDestroy

以上就是Fragment的生命周期介绍,是不是挺简单的。

如何使用Fragment

使用Fragment的方法有两种,一是 在Activity 的布局文件内声明,二是通过编程方式将其添加到某个现有 ViewGroup

  • 布局文件内声明

直接在所要寄宿的activity的布局文件中,使用标签,每个内都需要提供一下 id,name属性,具体可参考以下代码

 <fragment android:name="com.example.news.ArticleListFragment"
             android:id="@+id/list"
             android:layout_width="match_parent"
             android:layout_height="match_parent" />

注意:每一个fragment都需要有一个唯一标识其的id或者tag,方便系统可以使用该标识符来恢复fragment

  • 添加到某个现有 ViewGroup

第二种方式,就比第一种使用起来就会更加动态些,可以在activity运行期间随时的将fragment添加到其布局中,只需要指定viewGroup,其使用方式如下代码

 //获取fragment管理器
 val fragmentManager = supportFragmentManager
 //fragment事务
 val fragmentTransaction = fragmentManager.beginTransaction()
 //添加fragment时
 val fragment = xxxxxFragment()
 fragmentTransaction.add(viewGroupID, fragment)
 //一旦您通过FragmentTransaction做出了更改,就必须调用 commit() 以使更改生效
 fragmentTransaction.commit()

对于FragmentManager有如下常用操作,更多操作请参考官方文档

  • 通过 findFragmentById()(针对在 Activity 布局中提供界面的片段)或 findFragmentByTag()(针对提供或不提供界面的片段)获取 Activity 中存在的片段。
  • 通过 popBackStack()(模拟用户发出的返回命令)使片段从返回栈中弹出。
  • 通过 addOnBackStackChangedListener() 注册侦听返回栈变化的侦听器

而FragmentTransaction则是用于Fragment的添加、移除、替换以及其他操作,那么如何将一个片段替换为另一个片段,可以参考一些代码

 val newFragment = ExampleFragment()
 val transaction = supportFragmentManager.beginTransaction()
 transaction.replace(ViewGroupID, newFragment)
 transaction.addToBackStack(null)
 transaction.commit()

这些代码表达了什么逻辑,我在这简单说一下吧,首先newFragment 会替换目前在 ViewGroup ID 所标识的布局容器中的任何Fragment(如有)。之后调用 addToBackStack(),可以将替换事务保存到返回栈,以便用户能够通过按返回按钮撤消事务并回到上一Fragment。

然后FragmentActivity 会自动通过 onBackPressed() 从返回栈检索Fragment。如果您向事务添加多个更改(如又一个 add()remove()),并调用 addToBackStack(),则调用 commit() 前应用的所有更改都将作为单一事务添加到返回栈,并且返回按钮会将它们一并撤消。

注意:如果您要向同一容器添加多个Fragment,则您添加Fragment的顺序将决定它们在视图层次结构中出现的顺序

最后

以上就是Fragment的基础知识,并没有太难理解的地方,希望大家在阅读完后,能动手实践实践,加深理解。本文所写的是本人根据官方参考资料,以及网上所学的个人见解,如有错误或者不恰当之处,欢迎私信我,加以改正!同时期待您的关注,感谢您的阅读,谢谢!

参考

Fragment | 安卓开发者