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

    你可能感兴趣的文章
    PHP $_FILES函数详解
    查看>>
    php & 和 & (主要是url 问题)
    查看>>
    php -- 魔术方法 之 判断属性是否存在或为空:__isset()
    查看>>
    php -- 魔术方法 之 获取属性:__get()
    查看>>
    php -树-二叉树的实现
    查看>>
    PHP -算法-二路归并
    查看>>
    php 2条不一样 的json数据 怎么放在一个json里面_如果你是PHP开发者,请务必了解一下Composer...
    查看>>
    php 360 不记住密码,JavaScript_多种方法实现360浏览器下禁止自动填写用户名密码,目前开发一个项目遇到一个很 - phpStudy...
    查看>>
    regExp的match、exec、test区别
    查看>>
    php aes sha1解密,PHP AES加密/解密
    查看>>
    php csv 导出
    查看>>
    PHP imap 远程命令执行漏洞复现(CVE-2018-19518)
    查看>>
    php include和require
    查看>>
    ref 和out 区别
    查看>>
    php JS 导出表格特殊处理
    查看>>
    php json dom解析
    查看>>
    ReentrantReadWriteLock读写锁解析
    查看>>
    php laravel请求处理管道(装饰者模式)
    查看>>
    PHP mongoDB 操作
    查看>>
    ReentrantLock读写锁
    查看>>