Android Jetpack 应用指南(三) - Navigation

简介:

前言

在Android开发的过去几年中,在公司的项目中一直没有机会尝试单Activity多Fragment的开发模式,随着Google推出Navigation组件,我意识到,终于有机会学习一种全新的开发模式了。

与上一篇文章相同,本篇同样是Navigation的初探,会用尽可能简洁的方式来了解Navigation,让我们对Navigation有一个初步印象,不会长篇大论或者源码轰炸,导致干货太多引起阅读困难。

目录

  • Navigation简介
  • Navigation的组成
  • Navigation实践

正文

Navigation简介

Navigation又称导航组件,主要负责应用内导航,也就是我们常说的屏幕切换。应用导航是Android开发中很重要的一部分,过去我们一般通过Intent或Fragment事物来实现应用内导航,使用场景也比较简单,点击按钮切换屏幕即可。

但是当场景变得复杂后,导航的管理就会便得十分困难。比如App首页常见的底部导航模式,不仅要确保用户在点击底部导航栏后,应用界面可以正常跳转,而且还需要突出显示正确的按钮,在处理返回栈的时候,也同样需要注意这个问题。而新的导航组件,就可以出色的解决这类复杂的问题。

通过引入navigation,我们可以轻松地使用navigation完成以下工作:

  • 简化常见导航模式的设置工作
  • 管理返回栈
  • 自动处理fragment事务
  • 简化类型安全参数传递
  • 管理转场动画
  • 轻松设置深度链接

同时navgation中引入了一种全新的资源文件,还可以集中种存储并可视化导航信息,极大程度地方便了开发人员对于屏幕切换的管理。

Navigation的组成

一个完整的Navigation由导航图、导航容器、导航控制器三个部分组成,下面分别来讲解这三个部分:

  • 导航图

    是一个新增的资源类型,它是一个XML文件,用于集中保存所有导航相关的信息,在Android Studio 3.3中提供了新的导航编辑器,能够可视化这些信息。在开发中,我们可以把它当作一款创建视图的图片编辑器。

image

在导航图中,一个屏幕代表一个destination(目的地),也就是导航指向的下一个视图,单Activity的开发中,可以利用Fragment来创建destination。
选中一个destionation后,我们可以定义深层链接URL和启动选项等等

导航图中的箭头叫做action,代表您可以在应用中使用的几条导航路径,选中其中一个action后,我们就能看到一组内嵌信息,包括各个destionation间传递的信息、转场动画、返回栈操作等

  • 导航容器

    导航容器是一个name为NavHostFragment的fragment布局,它的本质就是一个导航界面的容器,用来动态替换应用中各个destionnation所代表的fragment。我们需要在布局中添加这个Fragment widget,如图所示:

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

    导航图支持在Android studio3.3中进行可视化操作,在使用navigation时,建议将Android studio升级到3.3及以上的版本。

  • 导航控制器

    导航控制器用于设定导航组件行为与方向的组件,我们需要在java或者kotlin代码中为每一个NavHostFragment添加对应的NavController,以便管理和控制具体的导航行为。

      Navigation.findNavController(it).navigate(R.id.navi2Fragment)
    

    通过添加 navController.navigate(R.id.xxx),navcontroller就会根据导航图中的信息来执行相应的导航操作,并最终把需要显示的fragment切换到NavHostFragment中。

Navigation实践

简单介绍了Navigation的组成后,我们通过完成一个底部导航,来继续深入了解Navigation的使用。

1.引入Navigation依赖

根据项目使用的语言,在module的build.gradle中添加对于语言的依赖

dependencies {
  def nav_version = "2.0.0"
  def nav_version_ktx = "2.0.0"

  // Java
  implementation "androidx.navigation:navigation-fragment:$nav_version"
  implementation "androidx.navigation:navigation-ui:$nav_version"

  // Kotlin
  implementation "androidx.navigation:navigation-fragment-ktx:$nav_version_ktx"
  implementation "androidx.navigation:navigation-ui-ktx:$nav_version_ktx"

}

2.创建导航图

在res文件夹下新建一个名为navigation的资源文件夹

image
然后在navigation中新建导航图,名称任意,这里使用module的名称加一个graph后缀

image

3.创建导航容器

新建一个Activity用于管理fragment,同时创建对应的布局文件,activity布局文件中包含一个导航容器fragemnt,和一个底部BottomNavigationView。

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <fragment
        android:id="@+id/content"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:defaultNavHost="true"
        app:layout_constraintBottom_toTopOf="@+id/bottomNavigationView"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:navGraph="@navigation/aac_graph" />

    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/bottomNavigationView"
        android:layout_width="0dp"
        android:layout_height="55dp"
        android:background="@android:color/white"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:menu="@menu/main_menu" />
</androidx.constraintlayout.widget.ConstraintLayout>

activity中将工作托管给具体的NavController,它可以确保返回栈中的所有导航工作都遵循MD最佳实践

class NavigationActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_navigation)

        val host: NavHostFragment = supportFragmentManager!!.findFragmentById(R.id.content) as NavHostFragment?
                ?: return
        val navController = host.navController

        val bottomNav = findViewById<BottomNavigationView>(R.id.bottomNavigationView)
        bottomNav?.setupWithNavController(navController)
    }
}

4.新建fragment选项卡,修改导航图

新建四个fragment,具体的内容可以任意,只是用作选项卡。

image

然后打开导航图,将新增的4个fragment选项卡添加进入导航图中

image

到此为止,一个底部导航可以动态切换的首页就完成了,是不是比我们平常使用fragment事务的写法要简单很多?

总结

本篇文章简要(是不是过于简要了?)概述了AAC架构中Navigation组件及其简单使用,Navgation是构建单Activity多Fragment应用的核心组件,同样我们先对它又一个大致的印象即可,细节的问题,我们可以日后再聊。

目录
相关文章
|
27天前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
106 4
|
15天前
|
JSON Java API
探索安卓开发:打造你的首个天气应用
在这篇技术指南中,我们将一起潜入安卓开发的海洋,学习如何从零开始构建一个简单的天气应用。通过这个实践项目,你将掌握安卓开发的核心概念、界面设计、网络编程以及数据解析等技能。无论你是初学者还是有一定基础的开发者,这篇文章都将为你提供一个清晰的路线图和实用的代码示例,帮助你在安卓开发的道路上迈出坚实的一步。让我们一起开始这段旅程,打造属于你自己的第一个安卓应用吧!
41 14
|
18天前
|
Java Linux 数据库
探索安卓开发:打造你的第一款应用
在数字时代的浪潮中,每个人都有机会成为创意的实现者。本文将带你走进安卓开发的奇妙世界,通过浅显易懂的语言和实际代码示例,引导你从零开始构建自己的第一款安卓应用。无论你是编程新手还是希望拓展技术的开发者,这篇文章都将为你打开一扇门,让你的创意和技术一起飞扬。
|
15天前
|
搜索推荐 前端开发 测试技术
打造个性化安卓应用:从设计到开发的全面指南
在这个数字时代,拥有一个定制的移动应用不仅是一种趋势,更是个人或企业品牌的重要延伸。本文将引导你通过一系列简单易懂的步骤,从构思你的应用理念开始,直至实现一个功能齐全的安卓应用。无论你是编程新手还是希望拓展技能的开发者,这篇文章都将为你提供必要的工具和知识,帮助你将创意转化为现实。
|
16天前
|
Java Android开发 开发者
探索安卓开发:构建你的第一个“Hello World”应用
在安卓开发的浩瀚海洋中,每个新手都渴望扬帆起航。本文将作为你的指南针,引领你通过创建一个简单的“Hello World”应用,迈出安卓开发的第一步。我们将一起搭建开发环境、了解基本概念,并编写第一行代码。就像印度圣雄甘地所说:“你必须成为你希望在世界上看到的改变。”让我们一起开始这段旅程,成为我们想要见到的开发者吧!
24 0
|
1月前
|
JSON Java Android开发
探索安卓开发之旅:打造你的第一个天气应用
【10月更文挑战第30天】在这个数字时代,掌握移动应用开发技能无疑是进入IT行业的敲门砖。本文将引导你开启安卓开发的奇妙之旅,通过构建一个简易的天气应用来实践你的编程技能。无论你是初学者还是有一定经验的开发者,这篇文章都将成为你宝贵的学习资源。我们将一步步地深入到安卓开发的世界中,从搭建开发环境到实现核心功能,每个环节都充满了发现和创造的乐趣。让我们开始吧,一起在代码的海洋中航行!
|
1月前
|
存储 搜索推荐 Java
打造个性化安卓应用:从设计到实现
【10月更文挑战第30天】在数字化时代,拥有一个个性化的安卓应用不仅能够提升用户体验,还能加强品牌识别度。本文将引导您了解如何从零开始设计和实现一个安卓应用,涵盖用户界面设计、功能开发和性能优化等关键环节。我们将以一个简单的记事本应用为例,展示如何通过Android Studio工具和Java语言实现基本功能,同时确保应用流畅运行。无论您是初学者还是希望提升现有技能的开发者,这篇文章都将为您提供宝贵的见解和实用的技巧。
|
1月前
|
搜索推荐 开发工具 Android开发
打造个性化Android应用:从设计到实现的旅程
【10月更文挑战第26天】在这个数字时代,拥有一个能够脱颖而出的移动应用是成功的关键。本文将引导您了解如何从概念化阶段出发,通过设计、开发直至发布,一步步构建一个既美观又实用的Android应用。我们将探讨用户体验(UX)设计的重要性,介绍Android开发的核心组件,并通过实际案例展示如何克服开发中的挑战。无论您是初学者还是有经验的开发者,这篇文章都将为您提供宝贵的见解和实用的技巧,帮助您在竞争激烈的应用市场中脱颖而出。
|
1月前
|
算法 Java 数据库
Android 应用的主线程在什么情况下会被阻塞?
【10月更文挑战第20天】为了避免主线程阻塞,我们需要合理地设计和优化应用的代码。将耗时操作移到后台线程执行,使用异步任务、线程池等技术来提高应用的并发处理能力。同时,要注意避免出现死循环、不合理的锁使用等问题。通过这些措施,可以确保主线程能够高效地运行,提供流畅的用户体验。
57 2
|
2月前
|
Java API Android开发
安卓应用程序开发的新手指南:从零开始构建你的第一个应用
【10月更文挑战第20天】在这个数字技术不断进步的时代,掌握移动应用开发技能无疑打开了一扇通往创新世界的大门。对于初学者来说,了解并学习如何从无到有构建一个安卓应用是至关重要的第一步。本文将为你提供一份详尽的入门指南,帮助你理解安卓开发的基础知识,并通过实际示例引导你完成第一个简单的应用项目。无论你是编程新手还是希望扩展你的技能集,这份指南都将是你宝贵的资源。
77 5