博客
关于我
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/

    你可能感兴趣的文章
    Node-RED中使用Notification元件显示警告讯息框(温度过高提示)
    查看>>
    Node-RED中实现HTML表单提交和获取提交的内容
    查看>>
    Node.js 函数是什么样的?
    查看>>
    Node.js 实现类似于.php,.jsp的服务器页面技术,自动路由
    查看>>
    node.js 怎么新建一个站点端口
    查看>>
    Node.js 文件系统的各种用法和常见场景
    查看>>
    node.js 配置首页打开页面
    查看>>
    node.js+react写的一个登录注册 demo测试
    查看>>
    Node.js中环境变量process.env详解
    查看>>
    Node.js安装与配置指南:轻松启航您的JavaScript服务器之旅
    查看>>
    Node.js的循环与异步问题
    查看>>
    Nodejs express 获取url参数,post参数的三种方式
    查看>>
    nodejs libararies
    查看>>
    nodejs npm常用命令
    查看>>
    nodejs 运行CMD命令
    查看>>
    nodejs-mime类型
    查看>>
    nodejs中Express 路由统一设置缓存的小技巧
    查看>>
    nodejs包管理工具对比:npm、Yarn、cnpm、npx
    查看>>
    NodeJs单元测试之 API性能测试
    查看>>
    nodejs图片转换字节保存
    查看>>