文章目录

  • navigation的主要元素
  • Navigation Graph的创建
  • 添加NavHostFragment
  • 创建destination
  • NavController完成导航并传递参数
  • 添加页面切换动画
  • 使用safe args插件传参
  • NavigationUI的使用

依赖

   implementation 'androidx.navigation:navigation-fragment-ktx:2.3.1'implementation 'androidx.navigation:navigation-ui-ktx:2.3.1'

navigation的主要元素

  1. Navigation Graph 一种xml资源文件,包含应用所有的页面以及页面之间的关系,也就是fragment的放置的地方,
  2. NavHostFragement 一种特殊的fragment, 可以理解为fragment的容器,是fragment展示UI的地方,Navigation Graph中的fragment通过NavHostFragement展示
  3. NavController 控制器,用于在代码中完成Navigation Graph中具体的页面切换工作

Navigation Graph的创建

res文件夹 -new - Android Resource File,新建Navigation Graph文件。


添加NavHostFragment

NavHostFragment是一个特殊的Fragment,添加到activity的布局中。

  1. 创建完nav_graph文件后引入,并告诉系统这是一个特殊的fragment-NavHostFragment
  2. app:defaultNavHos
  3. app:defaultNavHost=“true” 自动处理系统返回键
  4. navGraph 属性 设置该Fragment对应的导航图-
    <fragmentandroid:id="@+id/nav_host_fragment_container"android:name="androidx.navigation.fragment.NavHostFragment"android:layout_width="match_parent"android:layout_height="match_parent"app:defaultNavHost="true"app:navGraph="@navigation/nav_graph"/>

创建destination

指定默认第一个页面
app:startDestination 第一个要展示的fragment

指定你要去的页面

NavController完成导航并传递参数

第一个fragment中完成点击跳转并传递参数

        var view = inflater.inflate(R.layout.fragment_main, container, false)var bundle = Bundle()bundle.putString("user","Bliss")bundle.putInt("age",30)Navigation.findNavController(view).navigate(R.id.action_mainFragment_to_secondFragment,bundle)
//        方法二 Navigation.createNavigateOnClickListener(R.id.action_mainFragment_to_secondFragment)

添加页面切换动画

创建动画文件,官网上也有此标准文件,页面切换动画

slide_in_left文件

<?xml version="1.0" encoding="utf-8"?>
<set  xmlns:android="http://schemas.android.com/apk/res/android"><translate android:fromXDelta="-50%p" android:toXDelta="0"android:duration="@android:integer/config_mediumAnimTime"/><alpha android:fromAlpha="0.0" android:toAlpha="1.0"android:duration="@android:integer/config_mediumAnimTime" />
</set>

slide_in_right文件

<?xml version="1.0" encoding="utf-8"?>
<set  xmlns:android="http://schemas.android.com/apk/res/android"><translate android:fromXDelta="50%p" android:toXDelta="0"android:duration="@android:integer/config_mediumAnimTime"/><alpha android:fromAlpha="0.0" android:toAlpha="1.0"android:duration="@android:integer/config_mediumAnimTime" />
</set>

slide_out_left文件

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"><translate android:fromXDelta="0" android:toXDelta="-50%p"android:duration="@android:integer/config_mediumAnimTime"/><alpha android:fromAlpha="1.0" android:toAlpha="0.0"android:duration="@android:integer/config_mediumAnimTime" />
</set>

slide_out_right文件

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android"><translate android:fromXDelta="0" android:toXDelta="50%p"android:duration="@android:integer/config_mediumAnimTime"/><alpha android:fromAlpha="1.0" android:toAlpha="0.0"android:duration="@android:integer/config_mediumAnimTime" />
</set>

引入动画

<fragmentandroid:id="@+id/mainFragment"android:name="com.bliss.yang.jetapp.MainFragment"android:label="fragment_main"tools:layout="@layout/fragment_main"><actionandroid:id="@+id/action_mainFragment_to_secondFragment"app:destination="@id/secondFragment"app:enterAnim="@anim/slide_in_right"app:exitAnim="@anim/slide_out_left"app:popEnterAnim="@anim/slide_in_left"app:popExitAnim="@anim/slide_out_right" />

使用safe args插件传参

依赖

  classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.3.3"//safe-args插件传参数
plugins {id 'com.android.application'id 'kotlin-android'id 'androidx.navigation.safeargs' // app的build.gradle中引入添加的依赖
}

传参

 var bundle = MainFragmentArgs.Builder().setUser("Bliss91").setAge(31).build().toBundle()Navigation.findNavController(view).navigate(R.id.action_mainFragment_to_secondFragment,bundle)

接受参数

  if(bundle!=null){var user = MainFragmentArgs.fromBundle(bundle).uservar age = MainFragmentArgs.fromBundle(bundle).ageLog.e(TAG, "safe-args接收参数:$user,$age " )}

 <fragmentandroid:id="@+id/mainFragment"android:name="com.bliss.yang.jetapp.MainFragment"android:label="fragment_main"tools:layout="@layout/fragment_main"><actionandroid:id="@+id/action_mainFragment_to_secondFragment"app:destination="@id/secondFragment"app:enterAnim="@anim/slide_in_right"app:exitAnim="@anim/slide_out_left"app:popEnterAnim="@anim/slide_in_left"app:popExitAnim="@anim/slide_out_right" /><argumentandroid:name="user"app:argType="string"android:defaultValue="" /><argumentandroid:name="age"app:argType="integer"android:defaultValue="0" /></fragment>

NavigationUI的使用

使类似于APP bar中的按钮和菜单与导航页面关联起来
app bar menu
menu_setting

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<!--  此处的id要和nav_graph中的保持一致--><itemandroid:id="@+id/secondFragment"android:icon="@drawable/ic_launcher_foreground"android:title="设置"></item>
</menu>

activity中实例化菜单栏

//添加菜单栏override fun onCreateOptionsMenu(menu: Menu?): Boolean {super.onCreateOptionsMenu(menu)menuInflater.inflate(R.menu.menu_setting,menu)return true}

处理跳转逻辑

private var appBarConfiguration:AppBarConfiguration?=null//用于APPBar的配置private var navController:NavController?=null//用于页面的导航和切换navController = Navigation.findNavController(this,R.id.nav_host_fragment_container)navController?.let { _navController ->appBarConfiguration = AppBarConfiguration.Builder(_navController.graph).build()}//将APPBar和navController绑定if (navController!=null && appBarConfiguration!=null){NavigationUI.setupActionBarWithNavController(this, navController!!,appBarConfiguration!!)}if (navController!=null){navController?.addOnDestinationChangedListener { controller, destination, arguments ->Log.e(TAG, "onDestinationChanged: 页面切换监听")}}* 通过NavigationUI完成点击跳转*/override fun onOptionsItemSelected(item: MenuItem): Boolean {if (navController!=null){return NavigationUI.onNavDestinationSelected(item, navController!!)}return super.onOptionsItemSelected(item)}/*** 使用NavigationUI完成返回*/override fun onSupportNavigateUp(): Boolean {if (navController!=null && appBarConfiguration!=null){return NavigationUI.navigateUp(navController!!, appBarConfiguration!!)}return super.onSupportNavigateUp()}

由于menu是写在activity中,所以第二个fragment中清除一下menu区别效果

   override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {menu.clear()//清除父容器activity中的menu,super.onCreateOptionsMenu(menu, inflater)}

示例代码地址-navigation分支

Navigation和NavigationUI的使用相关推荐

  1. 初识Navigation(导航)

    初识JetPack之--Navigation(导航) 关于Navigation Navigation详解 Navigation涉及的概念: 界面讲解 本文为学习类文档,通过学习B站up主longway ...

  2. androidstuido_schooltest_1

    文章目录 Mainactivity.java: activity_main.xml: output: Mainactivity.java: package com.kanxue.schooltest_ ...

  3. 连接Android与ASP.NET Core Web API的完整教程

    目录 准备数据库 ASP.NET Core Web API项目 创建新的ASP.NET Core Web API项目 实体 导入EF Core 创建DbContext 将连接字符串添加到appsett ...

  4. (Anroid Studio)用简单代码实现BMI计算器并且将应用安装到手机上

    第一步:创建工程: 第二步:编写前端页面: 找到content_main.xml:  具体代码如下: <?xml version="1.0" encoding="u ...

  5. 桃词典 Peach Dictionary 简易英语词典app开发 安卓软件开发 Part 7

    前文: 桃词典 Peach Dictionary 简易英语词典app开发 安卓软件开发 Part 6 导航: 桃词典 Peach Dictionary 简易英语词典app开发 安卓软件开发 The E ...

  6. Android-001-标题栏(最上面栏的appname)文字居中

    Android-001-标题栏(最上面栏的appname)文字居中-2020-3-25 目录 一.大致结构如下 二.新建title_name.xml文件 三.修改MainActivity 一.大致结构 ...

  7. Android Studio 在MuMu模拟器上实现 xposed简单劫持

    一.起因: 最近想实现模拟定位功能.目的是周游列国而不搞签证.然而,最开始使用的是android开发者模拟定位的方式,结果微信压根不鸟我.不过当时发型钉钉倒是可行.可惜的是,后来钉钉升级了版本后直接把 ...

  8. 制作单词记录App(一)

    制作单词记录App(一) 制作单词记录App(一) 修正性能上的小bug 开始制作新单词界面 本文为学习类文档,通过学习B站up主longway777的视频,再加上自己的总结与理解的学习类文章,如有侵 ...

  9. Android移动开发基础——实训项目:个人财务软件

    目录 步骤 1.  项目计划 需求分析 程序流程图 2.  实现功能模块 修改APP图标 去除标题栏 制作引导页 登录模块 登录页面 注册页面 忘记密码页面 主页面(使用底部导航栏) 1.  主页面( ...

最新文章

  1. CaDDN:基于单目的3D目标检测新方法(CVPR2021)
  2. shell编程面试必会30题
  3. 灵宝机器人编程学校_灵宝两所学校上榜“河南省中小学人工智能教育实验学校”...
  4. php 栈、 出栈、入栈
  5. ForkJoin 学习使用笔记
  6. @import与link方式的区别
  7. iOS 性能优化那些繁杂琐碎的事儿
  8. Android 7.0应用冷启动流程分析
  9. python 修改文件只读_Python脚本去除文件的只读性操作
  10. 【RF基础】RF调用python函数基础
  11. 石墨烯的加入,新量子装置使人类离第二次量子革命真正又近一步
  12. 免费的PDF在线合并工具,拿走不谢!
  13. 单一职责原则(SIngel Responsibility Principle  SRP)
  14. (建立VLAN把接口加入VLAN)(VLAN间路由)(VLAN协议)
  15. 爬取前程无忧数据,并存入数据库
  16. html页面刷新回到顶部_HTML5 回到顶部
  17. Linux常用命令:
  18. 认准了大B客户,Trustdata从移动数据开始挖掘价值
  19. python 微信手气红包
  20. 帝国CMS (EmpireCMS)

热门文章

  1. 系统安装与常见蓝屏0X00000024/ED/7B
  2. 政协委员:最大愿望是让小学生步行上学
  3. Git 忽略文件的四种方式
  4. cx_oracle windows缺少100 dll,【已解决】由于找不到cxcore100.dll,无法继续执行代码解决方法...
  5. 也谈小学作文教学策略
  6. Javascript中的原型链、prototype、__proto__的关系
  7. pi network
  8. 个人日常教学工作的总结~~悲凉、失落和无奈
  9. [转](45)中断门和快速调用进0环详解,重写 WriteProcessMemory
  10. java的依赖注入_Java依赖注入的三种方式