2-Navigation路由与框架搭建

46 阅读3分钟

一、内容总览

image.png

二、Gradle新一代版本依赖管理

Gradle项目适配指南

使用一个较新版本的AS创建一个新的安卓项目时,AS会自动应用对应所需版本的gradle插件

1.构建工具版本升级

1.1 AS版本与其对应Android-Gradle-Plugin的对应关系

官网

image.png

此处以最新版本2025.2.1为例进行项目适配

2.Maven源适配

一个较新的AS项目,build.gradle(项目根目录)下没有buildscript{} allprojects{}对maven源的适配——>maven适配位置——>修改settings.gradle的pluginManagement{}

2.1 在maven源里标记allowInsecureProtocol=true,允许访问非安全

pluginManagement {
    repositories {
    //
        maven{
            allowInsecureProtocol=true
            url 'http://dl.bintray.com/umsdk/release'
        }
        google {
            content {
                includeGroupByRegex("com\.android.*")
                includeGroupByRegex("com\.google.*")
                includeGroupByRegex("androidx.*")
            }
        }
        mavenCentral()
        gradlePluginPortal()
    }
}
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
    }
}

rootProject.name = "jetpack_android_online"
include(":app")
 

dependencyResolutionMAnagement{}是所有依赖管理的地方,其中可配置更多的maven源

2.2 在dependencyResolutionMAnagement{}中配置阿里云的几个仓库

pluginManagement {
    repositories {
        maven{
               ...
    }
}
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
    //配置阿里云仓库
        maven{ url 'http://maven.aliyun.com/repository/releases' }
        maven{ url 'http://maven.aliyun.com/repository/google' }
        maven{ url 'http://maven.aliyun.com/repository/central' }
        maven{ url 'http://maven.aliyun.com/repository/gradle-plugin' }
        maven{ url 'http://maven.aliyun.com/repository/public' }
        google()
        mavenCentral()
    }
}

rootProject.name = "jetpack_android_online"
include(":app")

3.新一代版本依赖管理version catalogs

版本依赖管理方式对比

image.png

依赖版本管理version catalogs

  • 对所有module可见,可统一管理所有module的依赖
  • 支持声明依赖bundles,组合打包依赖减少重复代码
  • 支持在单独的libs.versions.toml文件中配置依赖。支持在项目间共享依赖
  • Gradle 7.0 版本之后,Version Catalogs (版本目录) 功能已经从“预览功能”毕业,成为一个正式功能不再需要通过 enableFeaturePreview() 来显式开启。Version Catalogs定义放在单独的 libs.versions.toml 文件(独立文件依赖管理)中

image.png

三、Jetpack Navigation组件实战

image.png

1.添加依赖

1.1 添加引用Navigation组件依赖

-修改libs.versions.toml 文件

[versions]
agp = "8.13.1"
#...保留现有的其他版本
navigation = "2.5.3"

[libraries]
androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
#...保留现有的其他版本

# Navigation 的独立依赖项 (保留在 [libraries] 中)
navigation-fragment-ktx = { group = "androidx.navigation", name = "navigation-fragment-ktx", version.ref = "navigation" }
navigation-ui-ktx = { group = "androidx.navigation", name = "navigation-ui-ktx", version.ref = "navigation" }

[plugins]
...

#新增 [bundles] 块,用于将多个依赖项打包

[bundles]
# 将两个 Navigation 库打包成一个别名
androidx-navigation = ["navigation-fragment-ktx", "navigation-ui-ktx"]

-修改 app/build.gradle.kts 文件

...
dependencies { 
    implementation(libs.bundles.androidx.navigation)
}

1.2 另外再添加引用material组件的依赖

androidx-material3:纯 Compose 项目。 Compose 专用的 Material 3 设计系统组件

google-android-material:混合式项目。有传统的 XML 布局,并且这些 XML 布局需要使用 Material 按钮、FloatingActionButton (FAB) 或 CoordinatorLayout 等组件

-修改libs.versions.toml 文件

[versions]
agp = "8.13.1"
#...保留现有的其他版本
navigation = "2.5.3"
material = "1.12.0"

[libraries]
androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
#...保留现有的其他版本

# Navigation 的独立依赖项 (保留在 [libraries] 中)
navigation-fragment-ktx = { group = "androidx.navigation", name = "navigation-fragment-ktx", version.ref = "navigation" }
navigation-ui-ktx = { group = "androidx.navigation", name = "navigation-ui-ktx", version.ref = "navigation" }

# --- 添加 Material Components 库 ---
google-android-material = { group = "com.google.android.material", name = "material", version.ref = "material" }

[plugins]
...

#新增 [bundles] 块,用于将多个依赖项打包

[bundles]
# 将两个 Navigation 库打包成一个别名
androidx-navigation = ["navigation-fragment-ktx", "navigation-ui-ktx"]

-修改 app/build.gradle.kts 文件

...
dependencies { 
    implementation(libs.bundles.androidx.navigation)
    implementation(libs.google.android.material)
    ...
}

2.创建layout/layout_activity_main布局

**使用布局容器FragmentContainerView

  • 一个自定义 View 继承 FrameLayout, 与 ViewGroup 不同, 它只接受 Fragment Views
  • fragment z-ordering 的处理。优化了两个 Fragment 退出和进入过渡不会互相重叠, 使用 FragmentContainerView 将先开启退出动画然后才是进入动画

指定name——>让fragment的视图view能显示到这个容器

NavHostFragment具备普通fragmennt所不具备的两个能力

(1)导航宿主 (2)导航控制器

app:defaultNavHost="true"

拦截activity on back pressed,即手机实体返回键的能力,从而能正确地处理fragment弹出栈的工作

image.png

3.创建navigation/nav_graph导航图

根节点必须是navigation(需要指定一个id),导航节点navigation本质上是一个导航图,描述了整个应用的所有页面的路由

startDestination制定一个开始节点,描述启动时需要加载的是哪一个fragment

<?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"
    android:id="@+id/nav_graph.xml"
    app:startDestination="id/home_fragment"
    >
    <fragment
        android:id="@+id/home_fragment"
        android:name="com.ffmpeg.jetpack_android_online.navigation.HomeFragment">
        <action
            android:id="@+id/navigate_to_category_fragment"
            app:destination="@+id/category_fragment"/>
    </fragment>

    <fragment
        android:id="@+id/category_fragment"
        android:name="com.ffmpeg.jetpack_android_online.navigation.CategoryFragment"
        >

    </fragment>

</navigation>

image.png

image.png

image.png

image.png

image.png

Navigation架构概述

image.png

Navigation原理解析——阅读源码

image.png

image.png

image.png