Fragment的使用(六)-FragmentManager
一、前言
在对Fragment的使用时候,FragmentManager是经常要用到的东西,当然使用Navigation的时候可能会不用这个。在这里面会有很多比较细节的地方,这里将其做个简单的整理记录
二、FragmentManager
在子类(如)都可以通过方法访问FragmentManager。在Fragment中可以通过parentFragmentManager()获取父类的FragmentManager,以及通过childFragmentManager()获取子Fragment 的FragmentManager。官方演示图如下:
对Fragment的add、remove、replace、hide、show是属于FragmentTransaction的操作,这里在后续文章进行记录。
三、常用api
- findFragmentById()和findFragmentByTag()查找符合条件的api
使用id进行查找
supportFragmentManager.commit {
replace<ExampleFragment>(R.id.fragment_container)
setReorderingAllowed(true)
addToBackStack(null)
}
...
val fragment: ExampleFragment =
supportFragmentManager.findFragmentById(R.id.fragment_container) as ExampleFragment
您可以在结构中定义的 Fragment 上使用android:tagXML 来分配标记,也可以在FragmentTransaction中的add()或replace()操作属性中分配标记。
supportFragmentManager.commit {
replace<ExampleFragment>(R.id.fragment_container, "tag")
setReorderingAllowed(true)
addToBackStack(null)
}
...
val fragment: ExampleFragment =
supportFragmentManager.findFragmentByTag("tag") as ExampleFragment
四、多返回栈技术
假设我们使用类似于选项卡那种功能,每一个选项卡中一个Fragment。那么这里单纯使用是无法完成这种功能的,因此官方推出来多返回栈功能。这里引用官方示例如下(不过更好的示例还是应该看[导航: 多返回栈 | MAD Skills]()):
FragmentManager在这种情况下,您应用可能需要支持和通过多种返回位置。一个示例可以让您应用使用多种导航栏saveBackStack()返回restoreBackStack()。保存一个返回并恢复另一个返回之间进行交换。 注意:或者,您也可以使用底部组件,该组件会自动处理对的多个返回支持。 saveBackStack()的工作方式类似于使用name参数调用popBackStack()调用之后指定事务以及在此的所有事务中。不同的事务saveBackStack() 。 例如,您在addToBackStack()提交之前FragmentTransaction,会将片段添加到使用返回: supportFragmentManager.commit { replace<ExampleFragment>(R.id.fragment_container) setReorderingAllowed(true) addToBackStack("replacement") } 在这种情况下,您可以通过调用saveState()来保存此片段事务和ExampleFragment状态: supportFragmentManager.saveBackStack("replacement") 注意:您必须还原saveBackStack()用于调用setReorderingAllowed(true)的事务,以确保可以将事务为一个原子操作。 您可以使用相同的参数调用restoreBackStack(),以恢复所有名称的事务以及所有保存的片段状态: supportFragmentManager.restoreBackStack("replacement") 注意:使用使用addToBackStack(),提交片段事务的可选名称,否则不能saveBackStack()和restoreBackStack()。
五、参考链接
- [片段管理器]()
- [导航: 多返回栈 | MAD Skills]()
