Navigation - SMAXLYB/JetpackPractice GitHub Wiki

Navigation

单Activity嵌套多个fragment的UI架构模式,使用navigation需要添加依赖库

  • Navigation主要元素
  1. Navigation Graph:新型xml资源文件(xml/navigation),包含fragment/activity页面以及页面之间的关系
  2. Destination:代表fragment或者activity
  3. NavHostFragment:特殊的fragment,是其他fragment的容器
  4. NavController:一个对象,在代码中完成页面的具体切换工作
    • 关系:NavController负责带你到Navigation Graph中的一个fragment,而NavHostFragment负责将这个fragment展示出来
  • 如何使用:
  1. 新建Navigation Graph资源文件,在activity布局文件中新增fragment标签,作为其他fragment的容器,并指明以下属性 声明这是特殊的Fragment:Name = androidx.navigation.fragment.NavHostFragment Fragment会处理系统返回键:defaultNavHost = true Fragment的导航图:navGraph = nav_graph资源文件 此时,graph资源文件就已经有了NavHostFragment
  2. 在Navigation Graph中新建一个Destination节点,此时在根标签中就会出现startDestination属性,继续新建另一个节点,第一个节点箭头指向其他节点,在第一个节点fragment标签中就会自动添加一个action子标签,包含了destination属性和id属性
  3. 设置动画:在graph资源文件中,指定进场出场动画,enter、exit表示fragment入栈时两个fragment的动画,popEnter、popExit表示fragment出栈时的动画
  4. 传递参数:传统传参,数据放入bundle,调用navigate(action,bundle)方法,目标fragment取出使用;使用safe args gradle插件,在项目中添加插件(classpath),在module中引用插件(aply),在graph资源文件中,在相应的fragment标签下添加argument子标签,同步后在java(generated)会生成1个action辅助类以及1个args辅助类,这个类有setter和getter方法,用来设置参数和取出参数,操作更安全,更直观内部存储实现是hashMap
  5. NavigationUI组件:将Appbar/BottomView和Navigation关联起来,实现联动效果 DeepLink:对于pendingIntent,使用NavDeepLinkBuilder(context)创建pendingIntent,打开pendingIntent会自动导航到目的地,如果有navController,可以直接调用CreateDeepLink();对于URL,在graph资源文件的目标fragment中添加deepLink子标签,在manifest的activity中添加nav_graph子标签