Android Jetpack 架构开发组件化应用实战
本项目采用组件化+MVVM 架构进行开发,对功能组件和业务组件进行拆分,通过 ARouter 进行组件之间的通信。本文主要是对整个应用的技术架构作一个简单的介绍。
项目地址:Android Jetpack架构开发组件化应用实战 欢迎 star
Kotlin+Jetpack+Coroutines+Retrofit+koin
项目整体架构图:
宿主 App 没有任何的业务代码,整个业务被拆分为各个 ft_lib 模块。对一些功能组件进行封装抽取为 lib,提供给上层依赖。ft_lib 之间没有任务依赖关系,通过 Arouter 进行通信。
首页分为 5 个 Tab,主要为首页、项目、导航、体系和我的。
整个页面框架使用 BottomNavigationView + Navigation 来搭建。通过 menu 来配置底部菜单。 通过 NavHostFragment 来配置各个 fragment。系统提供的 FragmentNavigator 的 navigate 方法中是通过 replace 来加载 fragment。 这就导致在切换 Tab 的时候 fargment 会重复的调用 onCreateView 方法。这肯定不是我们需要的。那么我们需要自定义自己的 FragmentNavigator 来替换系统 的,通过 show 和 hide 的方式来加载 fragment。具体方式会在后续系列文章中进行讲解。
因为 App 使用了沉浸式状态栏,那么在使用的过程中也会出现只有第一个 fragment 的沉浸式是起作用的,其他的基本不生效。这个问题要从系统源码着手解决。 根本原因是这段代码:
private WindowInsets brokenDispatchApplyWindowInsets(WindowInsets insets)
{
if (!insets.isConsumed()) {
final int count = getChildCount();
for (int i = 0; i < count; i++) {
insets = getChildAt(i).dispatchApplyWindowInsets(insets);
if (insets.isConsumed()) {
break;
}
}
}
return insets;
}
复制代码
直接 break 了。所以我们也需要自定义一个 view 来重写 dispatchApplyWindowInsets 方法。具体也会在后续文章中进行讲解。
下面就简单介绍下各个 Tab 的技术要点。
首页
首页主要分为顶部 Banner 和底部的文章列表。列表使用 Paging 加载。 并且封装了 AbsListFragment 和 AbsListViewModel 来快速搭建列表页面。 AbsListFragment 主要是封装了页面布局相关的元素。 AbsListViewModel 主要是封装了 paging 的一些常用配置等信息。 通过上述两个封装我们在开发列表页面的时候只需要关系 DataSource 和 adapter 即可。
项目
项目 Tab 主要使用的是 TabLayout 和 ViewPager2 来配合实现联动。同样的 ViewPager2 的页面也是直接继承了 AbsListFragment 来实现列表页面。
导航
导航页面主要分为顶部的搜索和底部的分类。点击搜索后打开新的页面。通过 fragment 来承载热门搜索和搜索返回结果。 底部的分类主要是通过 RecyclerView+ViewPager2 来实现的。通过设置 ViewPager2 的 orientation 为 ORIENTATION_VERTICAL 来实现列表滑动。
评论