Android Jetpack Navigation组件:导航选项(NavOptions)与多返回栈[转载]

684 阅读2分钟

前言

类似Activity,Fragment也有返回栈。我们可以通过NavOptions保存和恢复Fragment状态,灵活地管理返回栈。

一、NavOptions定义

NavOpstions是一个类,Android官方给它的注释只有一句话:

NavOptions stores special options for navigate actions

意思是NavOpstions存储导航操作的特殊选项。 在这里解释一下:除了目的地跳转和参数传递,其他都是特殊选项。

二、NavOptions属性

1.使用位置

我们可以在两个地方设置NavOptions属性:

  • NavController的navigate()方法里
  • 导航图的元素里

2.属性作用

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

image.png

(2) popUpToId

\

image.png

(3) popUpToInclusive

image.png

(4) popUpToSaveState

image.png

(5) restoreState

image.png

三、多返回栈

针对上述的SavedState Stacks有必要作出一些解释,也就是关于多返回栈的解释。

对于使用Navigation组件的同学多多少少都会看到过“Navigation组件支持多返回栈”之类的字眼,那么多返回栈是啥意思?在Navigation组件里,它其实跟字面表示的意思有所不同,因为其实可以通过返回按钮操作的返回栈只有一个。这个“多”体现在有多个用来保存状态的返回栈(SavedState Stacks),而用来保存状态的返回栈跟返回按钮没有任何关系。

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

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

原文链接:blog.csdn.net/stephen_sun…