首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Android Jetpack之Navigation

目录

Android Jetpack 之 Navigation

基本使用

底部导航控件

fragment的代码

底部navigationView与顶部fragment的联动

创建项目

分析使用代码

Navigation视图编辑器

简单的页面跳转

网页打开应用某个页面

通知打开某个应用页面

页面跳转

跳转传参数

DeepLink

Navigation源码分析

配置文件是如何被加载的

fragment的切换方式

修改NavFragmentHost切换fragment的方式

Android Jetpack 之 Navigation

为什么要从这个开始呢?

简单呀!!

更重要的是

无论您如何构建应用界面(使用 Fragment、Activity 还是其他组件),都要为应用设计屏幕间导航的功能。

所以我们先来看看jetpack的navigation库

这个库在androidx.navigation下

基本使用

创建项目

学习阶段,我们可以直接创建

运行起来这样的效果:

分析使用代码

这是它的目录结构:

一个主的Activity,三个Fragment

主Activity的布局代码main_activity.xml

底部导航控件

这一部分:

就是我们的底部切换的Tab,看名字同学们就知道了,BottomNavigationView,底部导航控件

它显示的内容由哪里控制呢?

这里有一个menu的属性,所显示的内容,就是由这里控制的。上图我们看到Home、Dashboard、Notifications

我们打开这个文件看看:

所以同学们以后使用BottomNavigationView知道怎么用了吧!

这就是模版代码了,拿到以后,修改成你的就行了。

到这里的话,显示出底部的几个tab,是可以的。但是怎么样跟顶部的Fragment进行联动呢?我们后面再看,接下来,我们看看fragment的代码,也就是上面部分的代码。

fragment的代码

这是fragment部分的代码

这里竟然是一个fragment,但是上方是怎么显示多个fragment并且切换的呢?

其实这个fragment是管理的fragment,也就是坑。

我们通过配置文件,把其他的配置文件填到这个坑里

眼睛犀利的同学估计已经发现了

这又是一个配置文件

对的,没错。这个配置文件,就是配置这个hostFragment要管理的fragment

我们看看代码:

这里面呢,有三个fragment

这几个属性应该不难理解吧,id,name属性指向我们的fragment,label是标签,layout是布局

这个属性表示什么意思呢?

表示默认要显示的页面,这里指向的是navigation_home,所以当我们启动起来的时候,默认显示的是HomeFragment

到这里,我们就知道了顶部的几个页面是怎么来的了。

再回去看看首页布局的代码

这里有一个

这个是什么意思呢?

这个其实是把返回按键的事件交给NavHostFragment处理。控制被管理的fragment/activity/dailog的返回。

okay,到这里的话,我们基本上就把上下两部分看完了。

那么它们两是怎么联动起来的呢?

点击底部的tab,就会切换顶部的fragment

底部navigationView与顶部fragment的联动

我们面向对象的思想,最简单的思维就是监听BottomNavigationView的选中变化,然后切换顶部的fragment。

这些都是Android的官方套件,所以google也希望我们一起使用。

既然希望我们组合使用的话,所以他们把这个切换的动作已经实现了,简单地关联上就行了。

看看代码吧

这样子,就关联起来了。底部的tab切换,上方的fragment则会切换了。

这就是fragment最基本的使用了。只有这些吗?当然不是!

Navigation视图编辑器

这一部分,同学们最好还是看视频吧,毕竟图片不好描述操作。

打开我们的/res/navigation/mobile_navigation.xml文件

然后切换到设计视图界面,右上角

从左侧视图可以看出结构,以及入口

前面我们说了,我们的navigation不仅可以管理fragment,也可以有activity,fragmentDialog

我们顺势,创建一个登录的activity吧

记得要在清单文件里注册一下。

然后点击视图左上角的添加按钮

添加完以后:

对应的xml文件也会多了一个activity

那又如何进行跳转呢?

页面跳转

比如说,我们要在首页-跳转-登录的activity上

我们选中home fragment,然后点击添加action的图标

还可以添加动画,如图,其他属性请看视频吧。

添加完以后

对应的xml文件就会有:

到这一步,还没行,我们只是声明了跳转关系,我们真的要跳转,还得添加简单的代码。

在我们的HomeFragment里添加一个跳转的按钮

这里面主要有一个Navigation.findNavController(root).navigate方法。

这个方法就是跳转到某个地方去,有多个重载方法:

可以使用deepLink,可以使用directions,也可以传参。这个后面我们再细分讲吧。

动画请参考这篇文章

Android开发Activity全局切换的动画效果

跳转效果:

跳转传参数

比如说我们的LoginActivity你可以给它传一个phoneNumber

跳转的时候,我们携带参数

那么在LoginActivity端,我们怎么获取呢?

google推荐使用 Safe Args 传递安全的数据

这里的话不推荐大家使用这些方式组件之间传值,通过ViewModel来进行数据传递就好。

DeepLink

深度链接

简单的页面跳转

怎么深度呢?

这里的使用则比较简单

xml文件多了这个玩意,跳转代码

跳转

网页打开应用某个页面

我们再看看这样一个案例:

类似于我们的隐式意图,同学们都用过。比如说在微信分享里打开链接后,会跳转到你对应的应用里。

比如说小程序里的打开其他应用

这个又是怎么实现的呢?

Activity注册的时候,意图过滤器这要写:

html文件怎么写呢?

测试

携带参数也很简单,在url上加参数即可

比如说

获取参数

结果:

可以传参,是不是可以做很多功能了呀。

通知打开某个应用页面

再来一个应用场景:消息推送的时候,打开某一个页面。比如说我们向客户端推送一篇广告文章,对吧!

通知官方文档notification

这里我们就创建一个通知

我们点击通知的时候,就可以打开对应的界面了。

如果需要设置参数则这样写:

okay,到这里的话,我们这个跳转也搞定了

Navigation源码分析

配置文件是如何被加载的

我们看到NavHostFragment的onCreate方法

我们可以找到

这个代码,如果mGraphId不为0直接处理,如果mGraphId为0,则通过其他方式获取一下。

接着就设置进去

通过资源ID调用的方法,会走到这里

看这个

这个方法的调用,就是把xml转成bean类

也就是会返回对象NavGraph,这个给到了谁呢?

就在NavController里头。

看完这个,我们就知道了,我们可以不使用xml进行配置,我们使用Java代码,或者使用Json来配置也是可以的。我们稍微修改一下代码,就可以进行扩展了。

这里的话,打个TODO吧,后面在我们的课程里,我们改成通过注解的方式,来实现配置。

fragment的切换方式

要看这代码,我们从哪里入手呢?

前面我们是不是有切换fragment的动作呀?没有,我们只是做跳转到activity,但是我们点击底部的tab,会切换上方的fragment。

这就是我们的入口了。

这是一个扩展函数

跟下去的话,我们会看到这么一行代码

一直走呀走,就会跟到这里

这个navigator是什么类型,还得看拿出来的是什么东西。我们这里研究的是Fragment,所以拿出来的应该是

所以调用navite的时候,调用的其实是FragmentNavitor里的navite方法,也就是这个

可以看到,这里面是replace的方式进行切换的

所以,当我们切换fragment的时候,生命周期的变化会频繁销毁和创建。

这里的话,我们改成添加和控制显示/隐藏的方式来替换掉。

修改NavFragmentHost切换fragment的方式

从前面的源码分析,我们知道了,切换是由FragmentNavigator去负责的。

如果我们直接继承这个类,去覆写navigate的方法,某些私有的属性用不了。

那怎么办呢?

既然都是继承自Navigator的,那我们也写一个我们的FragmentNavigator不就可以了吗?

其他代码复制FragmentNavigator的,然后修改即可。

修改完以后这样子了

HideSitchFragmentNavigator.java

代码:

这里是主要的代码,把replace替换成了hide

然后,我们写一个类去继承NavHostFragment,覆写里面的方法,我们前面看过代码。

NavHostFragment是在

创建FragmentNavigator的

所以我们覆写createFragmentNavigator的方法

我们的入口,就不要用NavHostFragment了

改成这样子

另外就是我们的Activity里,不要直接把navHostFragment与BottomNavigationView结合到一起。否则会把第一个做成singleTop模式,只要你切换到第一个,就会干掉其他的.

要修改成这样子:

测试结果:

这是运行的log

okay,navigation我们就到这里吧,详细内容同学们请去看视频教程吧。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200922A0CQ1R00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券