Android Jetpack Navigation组件(三):导航选项(NavOptions)与多返回栈

前言

类似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: Booleanapp:launchSingleTop="<boolean>"保证返回栈栈顶只有一个目的地实例。类似Activity的singleTop启动模式
popUpToId: Integerapp:popUpTo="@id/<目的地id>"将返回栈中popUpToId(默认不包括自己)之上的所有目的地弹出
popUpToInclusive: Booleanapp:popUpToInclusive="<boolean>"与popUpToId配套使用,true表示popUpToId自己也要弹出返回栈
popUpToSaveState: Booleanapp:popUpToSaveState="<boolean>"与popUpToId配套使用,true表示保存所有弹出的目的地的状态
restoreState: Booleanapp: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),而用来保存状态的返回栈跟返回按钮没有任何关系。

关于多返回栈我总结了以下几个要点:

  1. BackStack只有一个,SaveState Stack可以有多个
  2. 每个SaveState Stack只包含一个Fragment的状态
  3. 可以通过NavController的clearBackStack(destinationId: Int)方法清除保存的Fragment状态
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值