其他分享
首页 > 其他分享> > Fragment的使用(七)-FragmentTransaction

Fragment的使用(七)-FragmentTransaction

作者:互联网

文章目录

一、前言

Fragment的实际操作中其实并不是使用Fragment来进行操作的,而是通过使用FragmentTransaction进行操作的。比如add、replace、remove等等。

二、FragmentTransaction

通常使用FragmentManager来获取FragmentTransaction。如下:

val fragmentManager = ...
val fragmentTransaction = fragmentManager.beginTransaction()

操作完成之后通常使用commit()进行提交

三、常用api

  1. commit()commitNow()

调用 commit() 不会立即执行事务。相反,事务被安排在主 UI 线程上运行,只要它能够这样做。但是,如有必要,您可以调用 commitNow() 以立即在您的 UI 线程上运行片段事务。

请注意,commitNowaddToBackStack. 或者,您可以通过 调用执行所有尚未运行的调用FragmentTransactions提交的 挂起。这种方法与.commit()executePendingTransactions()addToBackStack

对于绝大多数用例,commit()这就是您所需要的。

  1. add()replace()remove()

本篇只记录replace()的示例,其它方式类似

// Create new fragment
val fragmentManager = // ...

// Create and commit a new transaction
fragmentManager.commit {
    setReorderingAllowed(true)
    // Replace whatever is in the fragment_container view with this fragment
    replace<ExampleFragment>(R.id.fragment_container)
}
  1. hide()show()

通过调用该函数可以对Fragment进行显示和隐藏操作

class CallBackFragment : Fragment(){
    ...
        parentFragmentManager.beginTransaction().show(this)
        parentFragmentManager.beginTransaction().hide(this)
    ...
}
  1. addToBackStack()popBackStack()

这两个函数是将Fragment添加到返回栈中,以及弹出返回栈到意思

当您对事务调用 addToBackStack() 时,请注意,事务可以包括任意数量的操作,如添加多个 Fragment、替换多个容器中的 Fragment,等等。弹出返回堆栈时,所有这些操作会作为一项原子化操作反转。如果您在调用 popBackStack() 之前提交了其他事务,并且您没有对事务使用 addToBackStack(),则这些操作不会反转。因此,在一个 FragmentTransaction 中,应避免让影响返回堆栈的事务与不影响返回堆栈的事务交织在一起。

  1. setMaxLifecycle()

FragmentTransactions会影响事务范围内添加的各个片段的生命周期状态。创建FragmentTransaction时,setMaxLifecycle()为给定片段设置最大状态。例如,ViewPager2使用setMaxLifecycle()将屏幕外片段限制为启动状态。

  1. setReorderingAllowed()

为了行为兼容性,默认情况下不启用重新排序标志。但是,它需要允许FragmentManager正确执行您的FragmentTransaction,特别是当它在后台堆栈上运行并运行动画和过渡时。启用该标志可确保如果多个事务一起执行,任何中间片段(即添加然后立即替换的片段)不会经历生命周期更改或执行其动画或转换。请注意,此标志会影响事务的初始执行和使用 撤销事务popBackStack()

四、setPrimaryNavigationFragment

在给定的时间,只FragmentManager返回一个控制Fragment。如果应用在屏幕上允许显示多个同级Fragment,或者应用使用子Fragment,则必须指定一个FragmentManager来处理应用的主要导航。

在事务内部定义该片段的调用setPrimaryNavigationFragment()方法,并控制一个片段的实例,并控制一个片段的主要事务childFragmentManager

将导航作为最重要的层外层,其中的活动作为最主要的外层结构,下面有一个片段。每一层都具有一个层级的导航片段。最内层再也没有可以从弹回的片段事务,控制权持续到这个阶段的下层,一直重复,一直到达其活动。

请注意两个或更多 Fragment,同时只有一个可以是主要导航 Fragment。如果将 Fragment 设置成导航 Fragment,会移除对先前 Fragment 的指定。在上例中,您如果显示将详情fragment设为主要导航fragment,移除对fragment的指定。

四、参考链接

  1. 有关子 Fragment 和同级 Fragment 的特殊注意事项

标签:片段,Fragment,事务,fragment,使用,commit,FragmentTransaction
来源: https://blog.csdn.net/Mr_Tony/article/details/122501579