前言
类似Activity,Fragment也有返回栈。我们可以通过NavOptions保存和恢复Fragment状态,灵活地管理返回栈。
一、NavOptions定义
NavOpstions是一个类,Android官方给它的注释只有一句话:
NavOptions stores special options for navigate actions
意思是NavOpstions存储导航操作的特殊选项。 在这里解释一下:除了目的地跳转和参数传递,其他都是特殊选项。
二、NavOptions属性
1.使用位置
我们可以在两个地方设置NavOptions属性:
- NavController的navigate()方法里
- 导航图的元素里
2.属性作用
| NavOptions类属性 | action属性 | 作用 |
|---|---|---|
| singleTop: Boolean | app:launchSingleTop="" | 保证返回栈栈顶只有一个目的地实例。类似Activity的singleTop启动模式 |
| popUpToId: Integer | app:popUpTo="@id/<目的地id>" | 将返回栈中popUpToId(默认不包括自己)之上的所有目的地弹出 |
| popUpToInclusive: Boolean | app:popUpToInclusive="" | 与popUpToId配套使用,true表示popUpToId自己也要弹出返回栈 |
| popUpToSaveState: Boolean | app:popUpToSaveState="" | 与popUpToId配套使用,true表示保存所有弹出的目的地的状态 |
| restoreState: Boolean | app:restoreState="" | 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);
- 通过元素设置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),而用来保存状态的返回栈跟返回按钮没有任何关系。
关于多返回栈我总结了以下几个要点:
1.BackStack只有一个,SaveState Stack可以有多个 2.每个SaveState Stack只包含一个Fragment的状态 3.可以通过NavController的clearBackStack(destinationId: Int)方法清除保存的Fragment状态