目录
前言
类似Activity,Fragment也有返回栈。我们可以通过NavOptions保存和恢复Fragment状态,灵活地管理返回栈。
一、NavOptions定义
NavOpstions是一个类,Android官方给它的注释只有一句话:
NavOptions stores special options for navigate actions
意思是NavOpstions存储导航操作的特殊选项。
在这里解释一下:除了目的地跳转和参数传递,其他都是特殊选项。
二、NavOptions属性
1.使用位置
我们可以在两个地方设置NavOptions
属性:
- NavController的navigate()方法里
- 导航图的<action>元素里
2.属性作用
NavOptions类属性 | <action>属性 | 作用 |
---|---|---|
singleTop: Boolean | app:launchSingleTop="<boolean>" | 保证返回栈栈顶只有一个目的地实例。类似Activity的singleTop启动模式 |
popUpToId: Integer | app:popUpTo="@id/<目的地id>" | 将返回栈中popUpToId(默认不包括自己)之上的所有目的地弹出 |
popUpToInclusive: Boolean | app:popUpToInclusive="<boolean>" | 与popUpToId配套使用,true表示popUpToId自己也要弹出返回栈 |
popUpToSaveState: Boolean | app:popUpToSaveState="<boolean>" | 与popUpToId配套使用,true表示保存所有弹出的目的地的状态 |
restoreState: Boolean | app:restoreState="<boolean>" | true表示恢复之前保存的目的地状态 |
3.使用举例
- 通过NavController的navigate()方法设置NavOptions
NavController navController = NavHostFragment.findNavController(this);
NavOptions navOptions = new NavOptions.Builder()
.setLaunchSingleTop(true) // 设置singleTop属性
.setPopUpTo(R.id.aFragment, true, true) // 三个参数分别为popUpToId, popUpToInclusive, popUpToSaveState
.setRestoreState(true) // 设置restoreState属性
.build();
navController.navigate(AFragmentDirections.actionAFragmentToBFragment(), navOptions);
- 通过<action>元素设置NavOptions
<action
android:id="@+id/action_aFragment_to_bFragment"
app:destination="@id/bFragment"
app:launchSingleTop="true"
app:popUpTo="@id/aFragment"
app:popUpToInclusive="true"
app:popUpToSaveState="true"
app:restoreState="true"/>
4.图像说明
(1) singleTop
(2) popUpToId
(3) popUpToInclusive
(4) popUpToSaveState
(5) restoreState
三、多返回栈
针对上述的SavedState Stacks
有必要作出一些解释,也就是关于多返回栈的解释。
对于使用Navigation组件的同学多多少少都会看到过“Navigation组件支持多返回栈”之类的字眼,那么多返回栈是啥意思?在Navigation组件里,它其实跟字面表示的意思有所不同,因为其实可以通过返回按钮操作的返回栈只有一个。这个“多”体现在有多个用来保存状态的返回栈(SavedState Stacks
),而用来保存状态的返回栈跟返回按钮没有任何关系。
关于多返回栈我总结了以下几个要点:
- BackStack只有一个,SaveState Stack可以有多个
- 每个SaveState Stack只包含一个Fragment的状态
- 可以通过NavController的clearBackStack(destinationId: Int)方法清除保存的Fragment状态