f'rgment是依附于activity或其他的fragment存在的,其复用性很高,而且fragment的视图层次是附加到宿主视图结构上的。一般一个activity上会有多个fragment依附于它,所以这就涉及到了fragment之间的切换。
一、自定义切换
1、首先在activity中添加一个FragmentContainerView容器(静态添加),然后选择首先依附的fragment是哪一个,具体代码如下:
<androidx.fragment.app.FragmentContainerView
android:id="@+id/fragmentContainerView"
android:name="com.example.myreviewlogin.fragments.PinLoginFragment"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
2、然后在buildgrable中添加依赖库:
implementation ("androidx.fragment:fragment-ktx:1.6.0")
3、在fragment内部运用
通过parentFragmentManager(得到fragment的父容器)来管理fragment的视图的动画效果,切换以及是否加入栈中
使用transaction切换:
val transaction = parentFragmentManager.beginTransaction()//在父容器里面所以要用这个
transaction.replace(R.id.fragmentContainerView,DetailFragment())//切换fragment
//transaction.add(R.id.fragmentContainerView,DetailFragment())动态添加fragment
transaction.addToBackStack(null)//需要回退的就加入栈
transaction.setReorderingAllowed(true)
transaction.commit()//commitNow和addToBackStack是冲突的
这里我们可以使用parentFragmentManager中commit函数管理更加方便
添加依赖:
implementation("androidx.navigation:navigation-fragment-ktx:2.6.0")
parentFragmentManager.commit {
replace(R.id.fragmentContainerView, DetailFragment())
addToBackStack(null)
setReorderingAllowed(true)
}
注意事项:
1、进行事务操作后要进行commit否则不会生效
2、如果同时多个添加了add()或remove(),并且调用了addToBackStack(),则会在调用commit前,会将其当作单一事务添加到返回栈中,并且返回按钮会将他们都撤销
3、commit后并不会立即执行,而是activity的UI线程可以执行该操作时安排在其他线程执行,commitNow()就是立即执行
4、每一个片段事务可以通过动画来过度比如说setTransition()
除此之外还可以使用navigation导航栏切换