这应该是MVVM开发框架的第三篇文章,前两篇可以查看:
写一个MVVM快速开发框架(一)基础类封装
写一个MVVM快速开发框架(二)组件化改造
单Activity+多Fragment模式
自从知道这一招之后我基本不太愿意使用activity了,fragment可以快速创建和管理,可以合理设计页面跳转,设计炫酷的跳转动画,一些操作可以统一进行管理。
- 用Fragment替代Activity
以前大部分时候都是将Activity作为页面,Fragment作为页面中的子页面(当时称之为碎片),基本上大部分功能由activity实现,比如老版本的淘宝app就是有上百个activity,当时卡顿的不要不要的。随着技术迭代,我们发现activtiy创建、切换、销毁所消耗的性能远比fragment要大,fragment如今也能替代activity实现大部分功能。
- 将Activity作为容器
我理解的单Activity+多Fragment
模式并不是指一个App一定只有一个activity,对于一些业务相关的场景,可以整合成一个单Activity+多Fragment
模块,将activity作为fragment的容器,让fragment去做UI绘制工作。
- 管理Fragment栈
我们可以使用navigation管理fragment,fragment之间的跳转、栈管理都轻而易举,navigation还可以设置切换动画、页面间的数据传递。
Navigation组件
Navigation是Jetpack组件之一,很早之前iOS就是采用的这种跳转方式,当时就在想Android为啥没有,没多久Navigation就面世了。
Navigation可以理解为以一个管理fragment的容器,在容器中各个fragment可以实现任意跳转,
基础使用:
- 我们需要在布局中创建Fragment容器:
<androidx.fragment.app.FragmentContainerView
android:id="@+id/main_fragment_container"
android:layout_width="match_parent"
android:layout_height="0dp"
android:name="androidx.navigation.fragment.NavHostFragment"
app:defaultNavHost="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:navGraph="@navigation/nav_main"/>
复制代码
- 创建navigation.xml文件
<?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"
android:id="@+id/navigation_main"
app:startDestination="@+id/mainFragment">
<fragment
android:id="@+id/mainFragment"
android:name="com.example.mvvm_develop.MainFragment"
android:label="MainFragment" />
</navigation>
复制代码
- 使用NavController
val navController = (childFragmentManager.findFragmentById(R.id.module_fragment_container) as NavHostFragment).navController
//跳转
navController.navigate(R.id.mainFragment)
复制代码
一些具体参数和用法:
navGraph
这个值指向xml文件,在xml文件中我们可以定义fragment,跳转行为,目的地等。
创建、新增Fragment:
