Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Android Jetpack - 使用 Navigation 管理页面跳转

Android Jetpack - 使用 Navigation 管理页面跳转

作者头像
NanBox
发布于 2019-07-09 11:05:35
发布于 2019-07-09 11:05:35
2.5K00
代码可运行
举报
文章被收录于专栏:NanBoxNanBox
运行总次数:0
代码可运行

在今年的 IO 大会上,发布了一套叫 Android Jetpack 的程序库。Android Jetpack 里的组件大部分我们都接触过了,其中也有一些全新的组件,其中一个就是 Navigation。

简介

Navigation 是用来管理 APP 里页面跳转的。起初,我以为它是用来代替 startActivity 的,但其实并不是,大家往下看就知道它的作用了。

另外,iOS 的同学可能会有似曾相识的感觉,Navigation 应该是有借鉴 Storyboard 的。

使用

我们先来看看 Navigation 的实现过程。

添加依赖

首先,需要使用 Android Studio 3.2 以上版本才能使用 Navigation。

在 build.gradle 中添加依赖:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
implementation "android.arch.navigation:navigation-fragment:$nav_version"
implementation "android.arch.navigation:navigation-ui:$nav_version"
复制代码

创建 navigation xml 文件

使用 「Android Resource File」创建 xml 文件的时候,可以看到在类型里,多了一个 Navigation 的选项:

创建成功后,就来到了文章开头的那个一个可视化的操作界面。点击左上角的添加小图标,会出现 Activity 和 Fragment,我们这里添加两个 Activity 和两个 Fragment:

配置 Action

Fragment 的右边有个小圆圈,点击并拖到另一个页面,这样我们就给这个 Fragment 添加了一个跳转行为,也就是 Action。

但是可以发现,Activity 的右边是没有这个小圆圈的,所以 Navigation 并不能处理从 Activity 发起的跳转。

左上角有个小房子的是显示的第一个页面,但由于 Activity 无法发起跳转,所以这里把 MainActivity 删除,把 MainFragment 作为主页面,并给它添加跳转到 SecondFragment 和 SecondActivity 的 Action:

自动生成的 xml 代码是这样的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    app:startDestination="@id/mainFragment">

    <fragment
        android:id="@+id/mainFragment"
        android:name="com.example.navigation.MainFragment"
        android:label="fragment_main"
        tools:layout="@layout/fragment_main">
        <action
            android:id="@+id/action_mainFragment_to_secondFragment"
            app:destination="@id/secondFragment"
            app:enterAnim="@anim/slide_in_right" />
        <action
            android:id="@+id/action_mainFragment_to_secondActivity"
            app:destination="@id/secondActivity" />
    </fragment>
    <fragment
        android:id="@+id/secondFragment"
        android:name="com.example.navigation.SecondFragment"
        android:label="fragment_second"
        tools:layout="@layout/fragment_second" />
    <activity
        android:id="@+id/secondActivity"
        android:name="com.example.navigation.SecondActivity"
        android:label="activity_second"
        tools:layout="@layout/activity_second" />

</navigation>
复制代码

布局中添加 Fragment

现在,我们第一个页面是 MainFragment,而 Fragment 需要 Activity 作为容器,修改 MainActivity 的布局:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <fragment
        android:id="@+id/fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:defaultNavHost="true"
        app:navGraph="@navigation/nav" />

</FrameLayout>
复制代码

其中有三个属性需要注意。使用 android:name 指定 Fragment 的类型为 NavHostFragment,使用 app:navGraph 指定 Navigation 文件。app:defaultNavHost="true" 的作用是,让 Navigation 处理返回事件,点返回按钮时并不是返回上一个 Activity,而是返回上一个「页面」,上一个「页面」有可能是 Activity,也可能是 Fragment。

至此,Navigation 的简单配置就算完成了,接下来看如何使用它。

配置跳转

在 Navigation 里,页面的跳转是交给 NavController 来处理的,获取 NavController 的方法有这么三种:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
NavHostFragment.findNavController(Fragment)
Navigation.findNavController(Activity, @IdRes int viewId)
Navigation.findNavController(View)
复制代码

拿到后,通过 navigate 方法,通过传入 Action 的 id,实现跳转,比如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
NavHostFragment
            .findNavController(this)
            .navigate(R.id.action_firstFragment_to_secondFragment)
复制代码

传参

页面的跳转少不了数据的传递,使用 Navigation,和我们原来的跳转一样,可以通过 Bundle 来传递参数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
val bundle = Bundle()
bundle.putString("name", "SouthernBox")
NavHostFragment
            .findNavController(this)
            .navigate(R.id.action_firstFragment_to_secondFragment, bundle)
复制代码

如果跳转到 Activity,可以从 intent.extras 获取到 bundle,如果是 Fragment,则从 arguments 获取到。

此外,还可以在 Navigation 的 xml 文件中配置传参,但这种方式目前支持的数据类型比较少,连 boolean 都不支持,而且我还碰到了 bug,所以目前不建议用。

转场动画

如果需要自定义的页面转场动画,使用 Navigation 可以很方便的实现。

这里举个例子,比如我们需要一个从右向左切入的过场动画,先创建这个动画的 xml 文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

    <translate
        android:duration="600"
        android:fromXDelta="100%"
        android:toXDelta="0" />

</set>
复制代码

然后我们回到 Navigation 的可视化编辑页面来,点击跳转的线,右边会出现过场动画的配置选项,将 xxxx 设为刚才创建的动画:

Navigation 的使用介绍就到这里。

思考

你可能已经明白,Navigation 主要是用来处理 Fragment 的跳转,所以说它并不是用来代替 startActivity,而是用来代替 FragmentTransaction 的相关操作。

在官方文档里,可以看到一个将传统跳转迁移到 Navigation 的建议。我简单理解为,将原本两个 Activity 之间的跳转,逐渐修改为使用一个 Activity 作为容器,用两个 Fragment 作为页面跳转。

看到这里,我联想到了在去年,Jake Wharton(目前在谷歌)有这么一个有争议的言论:

“一个 APP 只需要一个 Activity。”

在过去,要实现这种方式,就需要去解决复杂的 Fragment 堆栈处理,而且早期的 Fragment 坑比较多,处理不好容易出现页面穿透等问题。现在 Navigation 恰好解决了这些问题。

这一切联系起来,是不是能说明官方间接支持了「少用 Activity 多用 Fragment」的做法?你怎么看?

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年06月07日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【Jetpack】Navigation 导航组件 ② ( Navigation 核心要点说明 | 创建 Navigation Graph | 创建 NavHostFragment | 完整代码示例 )
必须按照上述流程进行创建 : Fragment -> Navigation Graph -> NavHostFragment -> NavController , 后面的组件依赖于前面的组件 , 否则无法实现 Navigation 导航 ;
韩曙亮
2023/10/11
7390
【Jetpack】Navigation 导航组件 ② ( Navigation 核心要点说明 | 创建 Navigation Graph | 创建 NavHostFragment | 完整代码示例 )
Jetpack:新一代导航管理Navigation
不知道小伙伴们是否注意到,用AS创建一个默认的新项目后,MainActivity已经有了很大的不同,最大的区别就是新增加了两个Fragment,同时我们注意到这两个Fragment之间跳转的时候并没有使用之前FragmentTransaction这种形式,而是使用了NavController和NavHostFragment,这就是新一代导航管理————Navigation。
BennuCTech
2022/04/12
9420
Jetpack:新一代导航管理Navigation
安卓Navigation系列——入门篇
本人16年毕业于中南林业科技大学软件工程专业,毕业后在教育行业做安卓开发,后来于19年10月加入37手游安卓团队;
37手游安卓团队
2020/11/24
2.3K0
Navigation的用法
  单个Activity嵌套多个Fragment的UI架构模式,已经被大多数的Android工程师所接受和采用。但是,对Fragment的管理一直是一件比较麻烦的事情。我们需要通过FragmentManager和FragmentTransaction来管理Fragment之间的切换。页面的切换通常还包括对应用程序App bar的管理,Fragment之间的切换动画以及Fragment之间的参数传递。纯代码的方式使用起来不是特别友好,并且Fragment和App bar在管理和使用的过程中显得很混乱。
故乡的樱花开了
2023/10/22
3670
Navigation的用法
❤️【Android精进之路-03】创建第一个Android应用程序竟然如此简单❤️
上一篇文章我们介绍了Android Studio的安装以及Android SDK的目录结构。这篇文章将介绍如何使用Android Studio创建第一个Android应用,重点介绍Android Studio的目录结构。
玖柒的小窝
2021/09/20
8340
❤️【Android精进之路-03】创建第一个Android应用程序竟然如此简单❤️
Navigation 详解一
Navigation 是 JetPack 中的一个组件,用于方便的实现页面的导航,所以抽象出了一个 destination 的概念,大部分情况一个 destination 就表示一个 Fragment,但是它同样可以指代 Activity、其它的导航图。
三流之路
2018/09/11
1.2K0
Navigation 详解一
Android Navigation + Fragment 制作APP主页面导航(步骤 + 源码)
  我相信你肯定见过这样的App主页面,底部或者顶部有多个按钮,点击之后会切换当前的页面,滑动当前页面也会切换底部按钮,这里我用几个App的主页面来说明一下吧
晨曦_LLW
2020/12/11
10.5K4
Android Navigation + Fragment 制作APP主页面导航(步骤 + 源码)
【详解】Android Jetpack 新组件之Navigation的用法和源码结构分析
5年以上开发经验,对架构设计以及性能调优有着深刻认知,负责京东商城商品详情的开发,热衷于学习和创新。
京东技术
2018/07/30
2.3K0
【详解】Android Jetpack 新组件之Navigation的用法和源码结构分析
JetPack--Navigation
当想要切换Fragment时,使用NavController对象,指定跳转Navigation Graph中哪个Fragment,那么NavHostFragment会切换成相应的Fragment
aruba
2021/12/06
6380
JetPack--Navigation
【Jetpack】Navigation 导航组件 ④ ( Fragment 跳转中使用 safe args 安全传递参数 )
之前的 默认 Navigation 跳转方法 , 只需要传入 navigation 资源 ID , 即可完成页面跳转 ;
韩曙亮
2023/10/11
6420
【Jetpack】Navigation 导航组件 ④ ( Fragment 跳转中使用 safe args 安全传递参数 )
Android Navigation的四大要点你都知道吗?
在JetPack中有一个组件是Navigation,顾名思义它是一个页面导航组件,相对于其他的第三方导航,不同的是它是专门为Fragment的页面管理所设计的。它对于单个Activity的App来说非常有用,因为以一个Activity为架构的App页面的呈现都是通过不同的Fragment来展示的。所以对于Fragment的管理至关重要。通常的实现都要自己维护Fragment之间的栈关系,同时要对Fragment的Transaction操作非常熟悉。为了降低使用与维护成本,所以就有了今天的主角Navigation。
Rouse
2019/10/24
1.7K0
【Jetpack】Navigation 导航组件 ⑤ ( NavigationUI 类使用 )
NavigationUI 类支持一些系统自带的控件 , 配置后 , 自动跳转 Fragment 界面的功能 , 使用起来非常简洁 , 支持的可配置 Navigation 跳转的控件有 :
韩曙亮
2023/10/11
1.1K0
【Jetpack】Navigation 导航组件 ⑤ ( NavigationUI 类使用 )
谷歌官方组件Navigation你会用了吗?
我们了解了Navigation之后,就不得不提Navigation Editor。我们可以通过Android Studio的 Navigation Editor去编辑和浏览我们的Navigation graph(导航图)
Demo_Yang
2019/04/17
1.2K0
谷歌官方组件Navigation你会用了吗?
Android Jetpack 之Navigation Architecture Component使用
activity中fragment默认为NavHostFragment,NavHostFragment通过navGraph与navigation导航编辑器进行关联。 app:defaultNavHost="true"可以让NavHostFragment处理系统的返回事件
蜻蜓队长
2018/08/03
1.4K0
Android Jetpack 之Navigation Architecture Component使用
Android-Jetpack笔记-Navigation之Fragment使用
Navigation是一种导航的概念,即把Activity和fragment当成一个个的目的地Destination,各目的地形成一张导航图NavGraph,由导航控制器NavController来统一调度跳转,本文会先简单分析下AS自带的示例代码。
Holiday
2020/08/10
1.7K0
Android-Jetpack笔记-Navigation之Fragment使用
1. Android_Jetpack组件---Naviagtion源码解析
一、Android Jetpack_Note_CodeLabs一Navigation
Hankkin
2019/06/14
2.2K0
【Jetpack】Navigation 导航组件 ① ( Navigation 引入 | Navigation 特点 | Navigation 重要组件 | Navigation 使用流程 )
Android 开发中 , 最常用的 UI 架构 就是 使用一个 Activity 嵌套多个 Fragment , 这就需要 对 Fragment 进行管理 ;
韩曙亮
2023/10/11
1.2K0
【Jetpack】Navigation 导航组件 ① ( Navigation 引入 | Navigation 特点 | Navigation 重要组件 | Navigation 使用流程 )
写一个MVVM快速开发框架:谈一谈“单Activity+多Fragment”模式
以前大部分时候都是将Activity作为页面,Fragment作为页面中的子页面(当时称之为碎片),基本上大部分功能由activity实现,比如老版本的淘宝app就是有上百个activity,当时卡顿的不要不要的。随着技术迭代,我们发现activtiy创建、切换、销毁所消耗的性能远比fragment要大,fragment如今也能替代activity实现大部分功能。
没关系再继续努力
2021/12/14
1.9K0
【Android进阶必学】JetPack指路明灯—Navigation
https://developer.android.com/guide/navigation
Android技术干货分享
2020/12/03
2.2K1
【Android进阶必学】JetPack指路明灯—Navigation
Navigation 详解三
在 BottomNavigationActivity 中添加 Toolbar,修改主题为 NoActionBar 的。
三流之路
2018/09/11
8580
Navigation 详解三
推荐阅读
相关推荐
【Jetpack】Navigation 导航组件 ② ( Navigation 核心要点说明 | 创建 Navigation Graph | 创建 NavHostFragment | 完整代码示例 )
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验