Jetpack之Navigation3

        上一篇详细讲述了如何通过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()方法返回,则会先从注册页面,返回到登录页面。然后因为没有上级引用页面了,才会无任何反应。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值