博客
关于我
Android Jetpack组件之Navigation使用-源码
阅读量:166 次
发布时间:2019-02-28

本文共 3257 字,大约阅读时间需要 10 分钟。

Android Jetpack Navigation 组件实践指南

前言

最近我简单浏览了Google推出的Jetpack框架,深感其在Android开发中的巨大价值。尤其是Android Architecture组件,能够深度解耦代码逻辑与UI界面,打造数据驱动型UI。作为一名开发者,我认为掌握Jetpack组件对项目开发至关重要。经过一次实践,我将从Navigation组件开始,详细分析其功能与应用场景。


Navigation组件是Android Jetpack的一部分,旨在简化Android应用的导航实现。通过在XML中定义导航图,并指定起始和目的地,Fragment之间建立连接。与传统的startActivity类似,Navigation提供了更直观且可视化的界面配置。其主要功能包括Fragment间跳转、参数传递、动画效果等。


在实战中,Navigation的核心三要素是:

  • Navigation Graph:导航图,定义目的地和路径。
  • NavHostFragment:导航主Fragment,承载导航图。
  • NavController:导航控制器,管理Fragment切换。
  • 添加依赖

    在模块层build.gradle中添加Navigation组件依赖:

    ext.navigationVersion = "2.0.0"dependencies {    // ...其它依赖    implementation "androidx.navigation:navigation-fragment-ktx:$rootProject.navigationVersion"    implementation "androidx.navigation:navigation-ui-ktx:$rootProject.navigationVersion"}

    若需使用Safe Args插件,需在项目和模块build.gradle中添加相关依赖。

    创建导航图
  • 在res/navigation目录下创建login_navigation.xml:
    1. 在LoginActivity中添加NavHostFragment:
    2. Fragment间跳转
    3. 方式一:ID导航

      findNavController().navigate(R.id.login, bundle)

      在WelcomeFragment中,设置跳转动画参数。

    4. 方式二:Safe Args

      WelcomeFragmentDirections.actionWelcomeToRegister().setEMAIL("test@example.com")

      通过Safe Args实现参数传递,简化代码逻辑。


    5. class NavHostFragment : Fragment() {    override fun onAttach(context: Context) {        super.onAttach(context)        if (defaultNavHost) {            requireFragmentManager().beginTransaction()                .setPrimaryNavigationFragment(this)                .commit()        }    }}
      • defaultNavHost属性控制是否为默认导航主Fragment。
      • onCreate中初始化NavController,并设置导航图。
      class NavController {    fun setGraph(graph: NavGraph, args: Bundle?) {        // 弹出旧图,设置新图        if (mGraph != null) {            popBackStackInternal(mGraph.id)        }        mGraph = graph        onGraphCreated(args)    }    fun navigate(node: NavDestination, args: Bundle?, navOptions: NavOptions? = null,              navigatorExtras: Navigator.Extras? = null) {        // 处理弹出操作        val popped = handlePop(navOptions)        // 获取Navigator        val navigator = mNavigatorProvider.getNavigator(node.navigatorName)        // 创建新的目的地        val newDest = navigator.navigate(node, addDefaultArgs(args), navOptions, navigatorExtras)        // 更新栈内        updateBackStack(newDest, args)        // 分发状态变化        dispatchOnDestinationChanged()    }}
      • setGraph替换当前导航图,并初始化Fragment栈。
      • navigate方法处理Fragment切换和状态更新。
      class NavigationUI {    companion object {        fun setupActionBarWithNavController(            activity: AppCompatActivity,            navController: NavController,            configuration: AppBarConfiguration        ) {            navController.addOnDestinationChangedListener(                Object : ActionBarOnDestinationChangedListener(activity, configuration)            )        }    }}
      • 绑定NavController与ActionBar,处理状态变化。

      导航流程

    6. 用户点击WelcomeFragment中的登录/注册按钮。
    7. NavController根据定义的导航图,切换到目标Fragment。
    8. Fragment切换时,通过NavController的navigate方法更新栈内状态。
    9. NavigationUI绑定布局(如NavigationView、ToolBar)更新状态。

    10. 总结

      Navigation组件通过简化导航流程,提升了Fragment管理的效率。通过其核心组件NavHostFragment、NavController和导航图,开发者可以轻松实现复杂的导航场景。结合Safe Args插件,参数传递更加简便。未来我将继续深入研究Jetpack组件,以构建更高效的Android开发项目。

    转载地址:http://iauj.baihongyu.com/

    你可能感兴趣的文章
    OpenCV与AI深度学习 | 基于YOLOv8实现高级目标检测和区域计数
    查看>>
    OpenCV与AI深度学习 | 基于YOLOv8的停车对齐检测
    查看>>
    OpenCV与AI深度学习 | 基于YoloV8的药丸/片剂类型识别
    查看>>
    OpenCV与AI深度学习 | 基于YOLO和EasyOCR从视频中识别车牌
    查看>>
    OpenCV与AI深度学习 | 基于图像处理的火焰检测算法(颜色+边缘)
    查看>>
    OpenCV与AI深度学习 | 基于拉普拉斯金字塔实现图像融合(步骤 + 代码)
    查看>>
    OpenCV与AI深度学习 | 基于机器视觉的磁瓦表面缺陷检测方案
    查看>>
    OpenCV与AI深度学习 | 基于深度学习的轮胎缺陷检测系统
    查看>>
    OpenCV与AI深度学习 | 如何使用YOLO-World做目标检测
    查看>>
    OpenCV与AI深度学习 | 如何使用YOLOv9分割图像中的对象
    查看>>
    OpenCV与AI深度学习 | 如何使用YOLOv9检测图片和视频中的目标
    查看>>
    OpenCV与AI深度学习 | 如何在 Docker 容器中使用 GPU
    查看>>
    OpenCV与AI深度学习 | 实战 | OpenCV中更稳更快的找圆方法--EdgeDrawing使用演示(详细步骤 + 代码)
    查看>>
    OpenCV与AI深度学习 | 实战 | OpenCV传统方法实现密集圆形分割与计数(详细步骤 + 代码)
    查看>>
    OpenCV与AI深度学习 | 实战 | OpenCV实现扫描文本矫正应用与实现详解(附源码)
    查看>>
    OpenCV与AI深度学习 | 实战 | 使用OpenCV和Streamlit搭建虚拟化妆应用程序(附源码)
    查看>>
    OpenCV与AI深度学习 | 实战 | 使用OpenCV确定对象的方向(附源码)
    查看>>
    OpenCV与AI深度学习 | 实战 | 使用YOLOv8 Pose实现瑜伽姿势识别
    查看>>
    OpenCV与AI深度学习 | 实战 | 使用YoloV8实例分割识别猪的姿态(含数据集)
    查看>>
    OpenCV与AI深度学习 | 实战 | 使用姿态估计算法构建简单的健身训练辅助应用程序
    查看>>