这是我参与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(导航)是一个便利页面跳转的库,能跳转到ActivityFragment,有着路由的功能。

安装依靠

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,感受一下像脑图一样明晰的页面导航吧!

构建单Activity的APP——Navigation(上)

2.NavHost(导航容器)

显示导航图中方针的空白容器。所有在导航图中的都会在这个容器中展现。它是一个放在Activity布局文件中的View,若是想增加一些在所有页面之上悬浮框之类的东西,仅需在Activity中增加。(该思路仅限单A多F的APP架构,想了解更多点击《跨页面拖拽悬浮控件新思路》)

3.NavController(导航控制器)

NavHost 中办理应用导航的对象。当用户在整个应用中移动时,NavController 会组织 NavHost 中方针内容的交换。

简而言之,Navigation是一个能控制页面依照咱们预设的导航道路进行导航的一个容器。