上一篇详细讲述了如何通过navigation进行fragment还有activity之间的跳转,但是只跳转不行,还需要返回的情况,这一篇,主要讲解一下如何进行返回的方法和,两种方式的区别。
三、Navigation返回方法的说明
navigation提供的返回方法,主要有两种,分别是
binding.btnNavUp.setOnClickListener{
findNavController().navigateUp()
}
binding.btnPopBack.setOnClickListener{
findNavController().popBackStack()
}
两种方法都能够实现返回上一个页面
方法名: | 是否有重载方法 | 是否支持deepLink返回 |
navigationUp() | 无,仅这一个方法可以调用 | 是 |
popBackStack() | 有多个重载方法,类似于NavOptions里面的参数 | 否 |
1)对于重载方法这个不过多赘述。popBackStack()更灵活一些,可以使用在一些特殊的多个页面返回的场景。而navigationUp()相对来说简单一些,只能一级一级的返回。无法进行跨页面的返回。其实在栈内页面数量大于1的情况下,navigationUp()调用的方法也是popBackStack()方法,只有在仅剩最后一个页面的情况下,会有不同。下面主要针对deepLink启动APP的场景进行说明。
2)对于deepLink这个场景,我们可以启动两个APP。分别名称分别是DemoAPP,主要是实现deepLink跳转的发起。示例代码如下:
binding.btnDeepLink.setOnClickListener{
var url = "myscheme://myhost/MyPath"
var uri = Uri.parse(url)
var intent = Intent();
intent.setData(uri);
this.startActivity(intent);
}
另一个APP名称是NavigationAPP,主要是实现返回事件。代码如下。
1)首先清单文件,跳转的fragment的载体的activity需要支持deeplink的启动。不然deeplink启动会失败。
<activity
android:name=".activity.NavigationMainActivity"
android:exported="true">
<!--启动-->
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<!--deepLink启动-->
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="myhost"
android:pathPattern="/MyPath"
android:scheme="myscheme" />
</intent-filter>
</activity>
2、navigation资源文件里面需要再具体的Fragment上,声明相关的deepLink的内容,
<fragment
android:id="@+id/fragment_register"
android:name="com.github.navigationdemo.fragment.RegisterFragment">
<deepLink app:uri="myscheme://myhost/MyPath" />
</fragment>
3、registerFragment里面的返回代码
binding.btnNavUp.setOnClickListener{
findNavController().navigateUp()
}
APP与页面之间的关系如下图
我们通过deepLink从A页面,跳转到注册页面的时候,
1)如果使用了popBackStack()方法进行返回,则不会有任何反应。因为当前栈内,没有任何的上级页面。
2)如果使用了navigtionUp()方法返回,则会先从注册页面,返回到登录页面。然后因为没有上级引用页面了,才会无任何反应。