理解 FragmentTransaction
2021-01-13 本文已影响0人
jkwen
以下内容来自对官方文档的阅读理解
根据用户操作,FragmentManager 可以对 Fragment 进行添加,移除,替换等操作。而这一系列的操作都是通过 transaction 来完成的,通过 FragmentTransaction 类提供的 API 我们可以指定 transaction 里的操作。例如,将多个操作放在一个 transaction 里,(一个 transaction 可以添加或替换多个 fragments)。
通过 FragmentManager 维护的 back stack 来存储 transactions,我们就可以像 Activities 那样做返回操作了,但前提是要调用 addToBackStack() 方法,不然是不会保存的。
如何获取到 FragmentTransaction 类的实例:
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
transaction 的最后一步必须是 commit 操作,commit() 方法告诉 FragmentManager 完成了 transaction 的所有操作,要注意的是,commit() 方法调用后,不会立即生效,而是要取决于主线程的任务安排。
FragmentTransaction 具体操作方法
- 向 FragmentManager 中添加一个 fragment,调用 add(),添加之后 fragment 会走到 Resume 的状态,即可见可操作。
- 从宿主中移除 fragment,调用 remove(),
要移除 fragment,首先要获取到具体 fragment 对象实例,可通过 FragmentManager 调用 findFragmentById() 或者 findFragmentByTag() ,移除之后 fragment 会走到 Destroy 的状态,即销毁。 - 替换 fragment,调用 replace(),等价于先调 remove(),再调 add() 方法。
- 展示或隐藏 fragments,调用 show()/hide(),通过这两个方法可以在不改变 fragment 生命周期的前提下展示或隐藏 fragment 布局。
- 解绑或关联 fragments,调用detach()/attach(),通过这两个方法可以将 fragment 解绑/关联宿主,这样会造成 fragment 进入 STOP 状态或重走 onCreate 等生命周期方法。注意,不要在一个 transaction 里调用 detach() 和 attach(),那样会相互抵消没效果。
总的来说,FragmentManager 想要对 fragments 进行操作,需要通过 FragmentTransaction 来完成,而 FragmentTransaction 提供的一些方法需要注意使用条件。而 FragmentManager 管理的 Back Stack 似乎是以 FragmentTransaction 为维度进行维护的。