谈一谈“单Activity+多Fragment”模式

这应该是MVVM开发框架的第三篇文章,前两篇可以查看:
写一个MVVM快速开发框架(一)基础类封装
写一个MVVM快速开发框架(二)组件化改造

单Activity+多Fragment模式

自从知道这一招之后我基本不太愿意使用activity了,fragment可以快速创建和管理,可以合理设计页面跳转,设计炫酷的跳转动画,一些操作可以统一进行管理。

  1. 用Fragment替代Activity

以前大部分时候都是将Activity作为页面,Fragment作为页面中的子页面(当时称之为碎片),基本上大部分功能由activity实现,比如老版本的淘宝app就是有上百个activity,当时卡顿的不要不要的。随着技术迭代,我们发现activtiy创建、切换、销毁所消耗的性能远比fragment要大,fragment如今也能替代activity实现大部分功能。

  1. 将Activity作为容器

我理解的单Activity+多Fragment模式并不是指一个App一定只有一个activity,对于一些业务相关的场景,可以整合成一个单Activity+多Fragment模块,将activity作为fragment的容器,让fragment去做UI绘制工作。

  1. 管理Fragment栈

我们可以使用navigation管理fragment,fragment之间的跳转、栈管理都轻而易举,navigation还可以设置切换动画、页面间的数据传递。

Navigation组件

Navigation是Jetpack组件之一,很早之前iOS就是采用的这种跳转方式,当时就在想Android为啥没有,没多久Navigation就面世了。

Navigation可以理解为以一个管理fragment的容器,在容器中各个fragment可以实现任意跳转,

基础使用:

  1. 我们需要在布局中创建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"/>
复制代码
  1. 创建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>
复制代码
  1. 使用NavController
val navController = (childFragmentManager.findFragmentById(R.id.module_fragment_container) as NavHostFragment).navController
//跳转
navController.navigate(R.id.mainFragment)
复制代码

一些具体参数和用法:

navGraph

这个值指向xml文件,在xml文件中我们可以定义fragment,跳转行为,目的地等。

创建、新增Fragment:

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享