一、前言
在对Fragment
的使用时候,FragmentManager
是经常要用到的东西,当然使用Navigation
的时候可能会不用这个。在这里面会有很多比较细节的地方,这里将其做个简单的整理记录
二、FragmentManager
在FragmentActivity
子类(如AppCompatActivity
)都可以通过getSupportFragmentManager()
方法访问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:tag
XML 来分配标记,也可以在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
。那么这里单纯使用popBackStack()
是无法完成这种功能的,因此官方推出来多返回栈功能。这里引用官方示例如下(不过更好的示例还是应该看[导航: 多返回栈 | MAD Skills](导航: 多返回栈 | MAD Skills_Android开发者-CSDN博客)):
FragmentManager
在这种情况下,您应用可能需要支持和通过多种返回位置。一个示例可以让您应用使用多种导航栏saveBackStack()
返回restoreBackStack()
。保存一个返回并恢复另一个返回之间进行交换。注意:或者,您也可以使用底部
NavigationUI
组件,该组件会自动处理对导航栏的多个返回支持。
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](导航: 多返回栈 | MAD Skills_Android开发者-CSDN博客)