上一篇讲解了如何创建工程的细节,和如何编写navigation资源文件,以及如何使用NavController通过actionId进行Fragment间的跳转。这篇文章,将会说明常用的跳转方法,例如跳转Activity,以及Fragment之间跳转的高级使用。
二、常用方法介绍
1、跳转Activity。本质还是通过findNavController().navigate(actionId)方法进行跳转,不过在navgation资源里面需要配置Activity的节点代码如下。
<activity
android:id="@+id/activity_agreement"
android:name="com.github.navigationdemo.activity.AgreementActivity" />
2、navigate重载方法介绍
navigate(@IdRes resId: Int, args: Bundle?)
这里的参数和普通的fragment传参类似,代码如下:
binding.btnGotoForgetPwd.setOnClickListener {
//获取导航控制器,并通过注册的nav_config资源,根据ActionID,进行跳转页面
//发送bundle
var bundle = Bundle()
bundle.putString("userName", "加班狗")
findNavController().navigate(R.id.goto_forget,bundle)
}
//此处为获取值并进行重现
val userName = arguments?.getString("userName") ?: ""
binding.tvGetArg.text="此处传过来的值为:${userName}"
navigate(@IdRes resId: Int, args: Bundle?, navOptions: NavOptions?)
这个方法需要着重讲一下里面的NavOptions,这个是一个很重要的参数,很多特殊的场景,都可以通过这个NavOptions进行实现。实现方式主要是依靠NavOptions.Builder()。例如下面代码
val navOption =
NavOptions.Builder().setPopExitAnim(R.anim.slide_from_left_to_right_out)
findNavController().navigate(
R.id.goto_forget,
null,
navOption.build()
)
接下来主要说明一下navOption里面的具体方法。
首先这里的几个setXXXAnim的方法,主要是做fragment转场动画用的,此处不做过多的赘述。
其他的几个方法可以看这里的说明
NavOptions.Builder().setPopExitAnim(R.anim.slide_from_left_to_right_out)
.setLaunchSingleTop(true)//类似于singleTop如果在栈顶,则不新建Fragment
.setPopUpTo(
R.id.goto_register,//要跳转页面动作的ActionID
inclusive = true,//表示是否也要弹出自己
saveState = false//表示是否保存弹出内容的状态信息。
)
此处对于setPopUpTo需要进行详细的说明: (此处借用scx_大佬的图片进行说明)
1)popUpToId ,inclusive=false saveState=false情况
2)popUpToId, inclusive=true , saveState=false情况
3)popUpToId,inclusive=true,saveState=true的情况
4)setRestoreState(true)
通过NavOptions的配置,可以实现首页-》登录-》注册-》首页的跳转。避免了fragment生命周期的管理。
同时这些属性也可以在navigation资源文件里面的action节点下面进行声明使用。
<action
android:id="@+id/goto_forget"
app:destination="@id/fragment_forget"
app:popExitAnim="@anim/slide_from_left_to_right_out"
app:launchSingleTop="true"/>