JetPack系列——Navigation(一),Android架构师必备框架技能核心笔记

app:navGraph="@navigation/nav_graph"/>

  • name属性指定NavHost的实现类,这里是NavHostFragment。
  • defaultNavHost=“true” 拦截系统返回键,当用户按下返回键时系统会将正在展示的Fragment返回。
  • navGraph属性 关联导航图。
2.4 为导航图添加目的地

首先需要创建两个Fragment,FirstFragment和SecondFragment,并且将这两个Fragment关联到我们的导航文件中。



<fragment
android:id="@+id/fragmentSecond"
android:name="com.example.navigationtest

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享

.SecondFragment"
android:label=“fragment_second”
tools:layout="@layout/fragment_second"/>

  • id 必填项,后面fragment跳转的时候要用到
  • name Fragment的全路径
  • layout Fragment的布局
2.5 添加跳转action

为了达到跳转的目的,需要为fragment添加用于跳转的action。

其中,destination指定了要跳转到的fragment,这也就是为什么在导航文件中创建fragment时要指定id的原因。定义好action之后,在FirstFragment中添加跳转的点击事件,使用Navigation将页面导航到SecondFragment中:

val view=inflater.inflate(R.layout.fragment_first, container, false)
val binding = FragmentFirstBinding.bind(view)
binding.btnFirst.setOnClickListener {
Navigation.findNavController(view!!).navigate(R.id.first_to_second)
}

navigate方法接收的参数就是前面定义的action。

2.6 添加转场动画

刚刚创建的跳转过程默认是没有动画效果的,现在把转场动画效果加上。修改导航文件中的action,添加动画属性:

运行程序,切换页面时就可以看到动画效果。

2.7 使用NavigationUI
2.7.1 NavigationUI的意义

在Navigation组件中,导航图是很重要的一部分,可以帮助我们了解页面之间的关系,并且快速完成页面间的切换,而在页面切换的过程中还伴随着菜单栏的变化。对于不同的页面,AppBar中的menu菜单很可能是不一样的。并且AppBar中的按钮和菜单同样可能承担着页面切换的工作,为了统一管理,JetPack引入了NavigationUI组件来将AppBar与Navigation中的导航图关联到一起。

2.7.2 NavigationUI的使用分析
  • 首先需要创建一个settingFragment并且关联到导航图文件中

  • 创建菜单文件menu_settings.xml
<?xml version="1.0" encoding="utf-8"?>

item的id需要和导航文件中的settingFragment保持一致,否则会无法跳转到settingFragment。

  • 在activity中实现跳转

class NavigationActivity : AppCompatActivity() {
private var navController: NavController? =null
private var appBarConfig:AppBarConfiguration?=null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = ActivityNavigationBinding.inflate(layoutInflater)
setContentView(binding.root)
// navController = Navigation.findNavController(this@NavigationActivity,R.id.nav_host_fragment)
val navHost = supportFragmentManager.findFragmentById(R.id.nav_host_fragment)
navController = navHost!!.findNavController()
appBarConfig = AppBarConfiguration(navController!!.graph)
NavigationUI.setupActionBarWithNavController(this, navController!!, appBarConfig!!)

}

override fun onCreateOptionsMenu(menu: Menu?): Boolean {
super.onCreateOptionsMenu(menu)
menuInflater.inflate(R.menu.menu_settings,menu)
return true
}

override fun onOptionsItemSelected(item: MenuItem): Boolean {
return NavigationUI.onNavDestinationSelected(item,navController!!)||super.onOptionsItemSelected(item)
}

override fun onSupportNavigateUp(): Boolean {
return NavigationUI.navigateUp(navController!!,appBarConfig!!)||super.onSupportNavigateUp()
}
}

AppBarConfiguration用于AppBar的配置,NavController用于页面导航。通过调用NavigationUI.setupActionBarWithNavController将NavigationUI、AppBarConfiguration以及NavController绑定到一起,最后通过onOptionsItemSelected完成菜单项的点击跳转。后面如果需要增加菜单项,只需要添加对应的fragment然后修改菜单文件即可。

2.7.3 监听页面切换

如果想要在页面切换的时候做一些其他操作,可以使用NavController提供的addOnDestinationChangedListener方法监听切换过程:

navController!!.addOnDestinationChangedListener { _, _, _ ->
Toast.makeText(this@NavigationActivity, “完成页面切换”, Toast.LENGTH_LONG).show()
}

2.8 传递参数
2.8.1 使用Bundle传递参数

这种方式属于传统方式传参,需要把用到的参数按照键值对的方式定义好,在跳转的时候将Bundle作为参数传递过去,然后在另一个页面接收:

//传参
val binding = FragmentFirstBinding.bind(view)
binding.btnFirst.setOnClickListener {
val bundle = bundleOf(“name” to “yang”,“age” to 32)
Navigation.findNavController(view!!).navigate(R.id.first_to_second,bundle)
}
//接收参数
val name=arguments?.getString(“name”)
binding.tvName.text = name

2.8.2 使用SafeArgs插件传参

使用SafeArgs插件之前需要先在gradle文件中配置该插件:

classpath “androidx.navigation:navigation-safe-args-gradle-plugin:2.3.2”
plugins {
id ‘com.android.application’
id ‘kotlin-android’
id ‘androidx.navigation.safeargs’
// id ‘androidx.navigation.safeargs.kotlin’
}

插件导入成功之后就可以定义参数了,在导航文件中为要传递参数的fragment中添加两个argument标签,用来定义参数:

<argument

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值