Fragment

墙:Activity
画:Fragment
画框:FragmentContainerView

Fragment 表示应用界面中可重复使用的一部分。fragment 定义和管理自己的布局,具有自己的生命周期,并且可以处理自己的输入事件。
fragment 不能独立存在。它们必须由 activity 或其他 fragment 托管。fragment 的视图层次结构会成为宿主的视图层次结构(栈)的一部分,或附加到宿主的视图层次结构。

FragmentManager 切换

FragmentManager 类负责在应用的 fragment 上执行一些操作,如添加、移除或替换操作,以及将操作添加到返回堆栈。

如果您使用的是 Jetpack Navigation 库,则您可能永远都不会与 FragmentManager 直接进行交互,因为该库会代表您来使用 FragmentManager。
不过,任何使用 fragment 的应用都在某种程度上使用了 FragmentManager,因此您需要了解它是什么以及如何工作。

  • add 添加
  • replace 替换
  • remove 移除

supportFragmentManager.commit{}

使用 commit{} 扩展函数
commit 扩展函数中将beginTransaction()、commit()都做好了
需要添加依赖才可使用:
implementation ("androidx.fragment:fragment-ktx:1.6.2")

  • setCustomAnimations() 动画
  • setReorderingAllowed(true)
  • addToBackStack() 入栈,允许返回键返回

实现 replace(R.id.fragmentContainerView,HomeFragment) 需要传入 FragmentContainerView 容器的资源 id
(该容器是在Activity中添加的)

1
2
3
4
5
6
supportFragmentManager.commit {
setCustomAnimations(enter1, exit1, popEnter1, popExit1)//添加动画 顺序很重要
replace(R.id.fragmentContainerView,HomeFragment)
setReorderingAllowed(true)//允许在事务过程中重新排序 Fragment ,而不会影响其在视图层次结构中的位置
addToBackStack("name") // Name can be null
}

supportFragmentManager.beginTransaction()

传统方式: supportFragmentManager

1
2
3
4
5
//切换fragment
val fragmentTransaction = supportFragmentManager.beginTransaction()//开启事务
fragmentTransaction.add(R.id.fragmentContainerView, HomeFragment())//配置
fragmentTransaction.addToBackStack( name: null)//将消失的fragment添加到栈里面,实现回退(切的时候才入栈)
fragmentTransaction.commit()//提交

Fragment生命周期

Fragment生命周期.png

Fragment本身的生命周期

onAttach()->依附到Activity上
onCreate()创建
onCreateView()界面布局,创建Fragment界面,这个界面长什么样子
onViewCreated()界面布局视图完毕 界面事件配置 点击事件
onStart()准备启动->渲染
onResume()交互

onPause()暂停 用户交互
onStop() 暂停消失
onDestoryView() fragment的视图销毁
onDestroy() 销毁fragment
onDetach()从Activity上取消依附关系

一幅画放到画框里面
onAttach()
当Fragment被附加到Activity时,系统会调用onAttach()方法。在这个方法中,可以通过参数获取到Fragment所依附的Activity的引用,可以用来进行一些初始化操作。

onCreate()
创建
系统会在Fragment创建时调用onCreate()方法。在这个方法中,可以进行一些初始化操作,比如设置布局、初始化变量等。

onCreateView() 界面布局,创建Fragment界面,这个界面长什么样子
当Fragment需要创建其布局时,系统会调用onCreateView()方法。在这个方法中,可以通过加载布局资源文件来创建Fragment的视图,并对视图进行初始化操作。通常在这个方法中会返回一个View对象,作为Fragment的布局。
注意使用inflater构建View时一定要将attachToRoot指明false,因为Fragment会自动将视图添加到container中,attachToRoot为true会重复添加报错。onCreateView并不是一定会被调用,当添加的是没有界面的Fragment就不会调用,比如调用FragmentTransaction的 add(Fragment fragment, String tag)方法。

onViewCreated() 界面布局完毕 界面事件配置

onStart()
启动界面
准备启动->渲染

onResume()
等待和用户交互

onPause()暂停 用户交互

onStop() 暂停消失

onDestoryView() fragment的视图销毁

onDestroy() 销毁fragment

onDetach()从Activity上取消依附关系


Fragment中用replace切换界面:
先加载Activity
进入 A
A onAttach()
A onCreate()
A onCreateView()
A onViewCreated()
A onStart()
A onResume()

切换到B ↓

A onPause()
A onStop()

B onAttach()
B onCreate()
B onCreateView()
B onViewCreated()
B onStart()

A onDestoryView()
B onResume()


再从 B 返回到 A 界面
B onPause()
B onStop()

A onCreateView()
A onViewCreated()
A onStart()

B onDestoryView()
B onDestroy()
B onDetach()

A onResume()

Fragment 和 Activity 生命周期的关系

Activity中添加了Fragment,进入界面的生命周期关系

A onAttach()
A onCreate()

@ onCreate()

A onCreateView
A onViewCreated
A onStart()

@ onStart()
@ onResume()

A onRusume()

+++++++

切换到后台:
A onPause()
@ onPause()
A onStop()
@ onStop()

从后台返回:
@ onRestart()
A onStart()

@ onStart()
@ onResume()

A onResume()


有两个Activity的情况
切换到新的Activity时,
对于旧的Activity@及其Fragment(入栈)操作和进入后台相同
切换到后台:
A onPause()
@ onPause()
A onStop()
@ onStop()

两个Activity切换时
@ onPause() //上一个Activity
.
.//中间是正常启动一个新界面的Activity和Fragment
.
@ onStop() //上一个Activity

从第二个Activity 返回到第一个Activity1
A onPause()
2 onPause()

1 onRestart()
1 onStart()
1 onResume()

A onStop()
2 onStop()

A onDestroyView()
A onDestroy()
A onDetach()

2 onDestroy()

Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.

扫一扫,分享到微信

微信分享二维码
  • Copyrights © 2023-2025 Annie
  • Visitors: | Views:

嘿嘿 请我吃小蛋糕吧~

支付宝
微信