博客
关于我
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英语单词,php常用英语单词,快速学习php编程英语(6)
    查看>>
    R3.4.0安装包时报错“需要TRUE/FALSE值的地方不可以用缺少值”,需升级到R3.5.0
    查看>>
    PHP获取curl传输进度
    查看>>
    PHP获取IP所在地区(转)
    查看>>
    PHP获取IP的方法对比
    查看>>
    php获取json里面内容
    查看>>
    R2的版本由来
    查看>>
    PHP获取图片宽度高度、大小尺寸、图片类型、用于布局的img属性
    查看>>
    PHP获取当前文件的绝对路径
    查看>>
    PHP获取当前时间、时间戳的各种格式写法汇总
    查看>>
    PHP获取当前页面的完整URL
    查看>>
    php获取数据库中数据生成json,中文乱码问题的解决方案
    查看>>
    php获取文件夹中文件的两种方法
    查看>>
    PHP获取日期的一些方法总结
    查看>>
    R2学习记录
    查看>>
    PHP获取本周的每一天的时间
    查看>>
    php获取用户真实IP和防刷机制
    查看>>
    php获取网页内容的三种方法
    查看>>
    R-CNN算法优化策略
    查看>>
    PHP规范PSR0和PSR4的理解
    查看>>