这是我参与11月更文挑战的第9天,活动详情查看:2021最后一次更文挑战
前言
在网上有个由来已久的APP构建思路,那就是APP由一个Activity和多个Fragment来构建。曾经的Fragment是一个大坑,把Activity作为页面的承载会更稳定且开发负担更低。但官方一直有个让Fragment变得更好的想法,从ViewPager2开始,到Jetpack Navigation,再加上官方推出的androidx.fragment.app这个新包等很多地方我们都能看到官方对Fragment的期许。重构后的Fragment加上一系列新的相关的组件使得开发的上手难度和稳定性都有了很大优化,这也使得构建单Activity多Fragment的APP难度骤降。
那用Fragment替换Activity的好处在哪呢?
首先创建一个Fragment实例比创建一个Activity实例要少,更重要的是Fragmen比作为一个四大组件之一的Activity更灵活,能更简单地符合更复杂的需求。Activity 是围绕应用的界面放置全局元素的理想位置。相反,Fragment 更适合定义和管理单个屏幕或部分屏幕的界面。
补: Jetpack的Navigation库提供了简便的方法来管理Fragment事务和回退栈,并且最近Navigation 2.4.0(虽然是alpha版)也推出了“多个返回堆栈”功能,管理多个返回堆栈也方便了我们的模块划分。
文章一览
就像文章标题一样,本系列文章旨在介绍如何构建一个单Activity多Fragment(后面用单A模式代指)的APP,文章会先介绍多个Fragment在一个Activity中的导航和通信,再到单A模式和组件化的结合。在实例中我将用到Jetpack的部分组件Navigation、ViewModel等,我会必要地介绍组件的部分特性,以免各位浪费时间,所以希望您在观看之前对Jetpack有些许认识(感谢)。
Jetpack Navigation
单A模式构建于Navigation之上,Navigation(导航)是一个方便页面跳转的库,能跳转到Activity
或Fragment
,有着路由
的功能。
安装依赖
在gradle文件中,我除了Navigation的依赖,还添加dataBinding配置项(为了布局方便)。
build.gradle(:app)
plugins {
id 'com.android.application'
id 'kotlin-android'
// ...
}
android {
// ...
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
buildFeatures {
dataBinding = true
}
}
dependencies {
// ...
implementation 'androidx.core:core-ktx:1.3.2'
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.2.0'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0'
implementation 'androidx.navigation:navigation-fragment-ktx:2.3.5'
implementation 'androidx.navigation:navigation-ui-ktx:2.3.5'
}
Navigation三剑客
Navigation中有三个主要的概念:Navigation Graph,NavHost和NavController。
1.Navigation graph(导航图)
Navigation graph
(导航图,文章中用NavGraph代指)是用来描述导航图的。它可以通过XML文件构建,也可以通过纯代码构建。这个组件有意思的一点在于AS支持了navigation XML的可视化操作,配置跳转和回退的目的地和动画效果非常方便。下面这张图模拟了多个页面的NavGraph,感受一下像脑图一样清晰的页面导航吧!
2.NavHost(导航容器)
显示导航图中目标的空白容器。所有在导航图中的都会在这个容器中展示。它是一个放在Activity布局文件中的View,若是想增加一些在所有页面之上悬浮框之类的东西,仅需在Activity中增加。(该思路仅限单A多F的APP架构,想了解更多点击《跨页面拖拽悬浮控件新思路》)
3.NavController(导航控制器)
在
NavHost
中管理应用导航的对象。当用户在整个应用中移动时,NavController
会安排NavHost
中目标内容的交换。
简而言之,Navigation是一个能控制页面按照我们预设的导航路线进行导航的一个容器。