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

    你可能感兴趣的文章
    Python:Google API - 从消息中获取 mimeTypes
    查看>>
    Python:subprocess.call,stdout to file,stderr to file,在屏幕上实时显示stderr
    查看>>
    Python:TypeError:无法连接“str“和“int“对象
    查看>>
    Python:XPath 在 ElementTree 中不可用
    查看>>
    Python:从 FTP 服务器下载文件
    查看>>
    python:从列表中创建元组列表
    查看>>
    Python:从嵌套列表中删除重复项
    查看>>
    Python:从间隔映射到值
    查看>>
    Python:使用 shell=False 的子进程调用不起作用
    查看>>
    Python:修改 PATH 环境变量的平台无关方式
    查看>>
    Python:假与 0
    查看>>
    Python:函数使用
    查看>>
    Python:函数进阶
    查看>>
    Python:在整数的二进制表示中查找最长的二进制间隙
    查看>>
    Python:如何从二进制转换为 base 64 并返回?
    查看>>
    Python:如何以非阻塞方式读取子进程的标准输出
    查看>>
    Python:如何使用 plotly 制作阴影区域或交替背景颜色?
    查看>>
    Python:如何根据日期时间获取值的计数
    查看>>
    python:如何检测串行 COM 上的设备名称/ID
    查看>>
    Python:如何模拟 datetime.utcnow()?
    查看>>