Navigation和NavigationUI的使用
文章目录
- 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的主要元素
- Navigation Graph 一种xml资源文件,包含应用所有的页面以及页面之间的关系,也就是fragment的放置的地方,
- NavHostFragement 一种特殊的fragment, 可以理解为fragment的容器,是fragment展示UI的地方,Navigation Graph中的fragment通过NavHostFragement展示
- NavController 控制器,用于在代码中完成Navigation Graph中具体的页面切换工作
Navigation Graph的创建
res文件夹 -new - Android Resource File,新建Navigation Graph文件。
添加NavHostFragment
NavHostFragment是一个特殊的Fragment,添加到activity的布局中。
- 创建完nav_graph文件后引入,并告诉系统这是一个特殊的fragment-NavHostFragment
- app:defaultNavHos
- app:defaultNavHost=“true” 自动处理系统返回键
- 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的使用相关推荐
- 初识Navigation(导航)
初识JetPack之--Navigation(导航) 关于Navigation Navigation详解 Navigation涉及的概念: 界面讲解 本文为学习类文档,通过学习B站up主longway ...
- androidstuido_schooltest_1
文章目录 Mainactivity.java: activity_main.xml: output: Mainactivity.java: package com.kanxue.schooltest_ ...
- 连接Android与ASP.NET Core Web API的完整教程
目录 准备数据库 ASP.NET Core Web API项目 创建新的ASP.NET Core Web API项目 实体 导入EF Core 创建DbContext 将连接字符串添加到appsett ...
- (Anroid Studio)用简单代码实现BMI计算器并且将应用安装到手机上
第一步:创建工程: 第二步:编写前端页面: 找到content_main.xml: 具体代码如下: <?xml version="1.0" encoding="u ...
- 桃词典 Peach Dictionary 简易英语词典app开发 安卓软件开发 Part 7
前文: 桃词典 Peach Dictionary 简易英语词典app开发 安卓软件开发 Part 6 导航: 桃词典 Peach Dictionary 简易英语词典app开发 安卓软件开发 The E ...
- Android-001-标题栏(最上面栏的appname)文字居中
Android-001-标题栏(最上面栏的appname)文字居中-2020-3-25 目录 一.大致结构如下 二.新建title_name.xml文件 三.修改MainActivity 一.大致结构 ...
- Android Studio 在MuMu模拟器上实现 xposed简单劫持
一.起因: 最近想实现模拟定位功能.目的是周游列国而不搞签证.然而,最开始使用的是android开发者模拟定位的方式,结果微信压根不鸟我.不过当时发型钉钉倒是可行.可惜的是,后来钉钉升级了版本后直接把 ...
- 制作单词记录App(一)
制作单词记录App(一) 制作单词记录App(一) 修正性能上的小bug 开始制作新单词界面 本文为学习类文档,通过学习B站up主longway777的视频,再加上自己的总结与理解的学习类文章,如有侵 ...
- Android移动开发基础——实训项目:个人财务软件
目录 步骤 1. 项目计划 需求分析 程序流程图 2. 实现功能模块 修改APP图标 去除标题栏 制作引导页 登录模块 登录页面 注册页面 忘记密码页面 主页面(使用底部导航栏) 1. 主页面( ...
最新文章
- CaDDN:基于单目的3D目标检测新方法(CVPR2021)
- shell编程面试必会30题
- 灵宝机器人编程学校_灵宝两所学校上榜“河南省中小学人工智能教育实验学校”...
- php 栈、 出栈、入栈
- ForkJoin 学习使用笔记
- @import与link方式的区别
- iOS 性能优化那些繁杂琐碎的事儿
- Android 7.0应用冷启动流程分析
- python 修改文件只读_Python脚本去除文件的只读性操作
- 【RF基础】RF调用python函数基础
- 石墨烯的加入,新量子装置使人类离第二次量子革命真正又近一步
- 免费的PDF在线合并工具,拿走不谢!
- 单一职责原则(SIngel Responsibility Principle SRP)
- (建立VLAN把接口加入VLAN)(VLAN间路由)(VLAN协议)
- 爬取前程无忧数据,并存入数据库
- html页面刷新回到顶部_HTML5 回到顶部
- Linux常用命令:
- 认准了大B客户,Trustdata从移动数据开始挖掘价值
- python 微信手气红包
- 帝国CMS (EmpireCMS)
热门文章
- 系统安装与常见蓝屏0X00000024/ED/7B
- 政协委员:最大愿望是让小学生步行上学
- Git 忽略文件的四种方式
- cx_oracle windows缺少100 dll,【已解决】由于找不到cxcore100.dll,无法继续执行代码解决方法...
- 也谈小学作文教学策略
- Javascript中的原型链、prototype、__proto__的关系
- pi network
- 个人日常教学工作的总结~~悲凉、失落和无奈
- [转](45)中断门和快速调用进0环详解,重写 WriteProcessMemory
- java的依赖注入_Java依赖注入的三种方式