Fragment的使用(六)-FragmentManager

一、前言

在对Fragment的使用时候,FragmentManager是经常要用到的东西,当然使用Navigation的时候可能会不用这个。在这里面会有很多比较细节的地方,这里将其做个简单的整理记录

二、FragmentManager

FragmentActivity子类(如AppCompatActivity)都可以通过getSupportFragmentManager()方法访问FragmentManager。在Fragment中可以通过parentFragmentManager()获取父类的FragmentManager,以及通过childFragmentManager()获取子FragmentFragmentManager。官方演示图如下:

在这里插入图片描述

Fragment的add、remove、replace、hide、show是属于FragmentTransaction的操作,这里在后续文章进行记录。

三、常用api

  1. 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。那么这里单纯使用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()

五、参考链接

  1. [片段管理器](Fragment 管理器  |  Android 开发者  |  Android Developers)

  2. [导航: 多返回栈 | MAD Skills](导航: 多返回栈 | MAD Skills_Android开发者-CSDN博客)

  3. Multiple back stacks

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值