Navigation 基础知识概述
- NavHost 装碎片的容器
- Fragment 碎片,用于在界面上设置一小块布局
- NavController 用来控制碎片切换逻辑
- NavGraph 图形化设置页面切换逻辑
例子
- 两碎片,布局分别是一个按钮一个标签
- 从developers中将navigation的依赖添加进来
- 设置resourceFile->navigation(my_nav_graph),将刚刚添加的两个碎片相互连线
- 在主布局中放置NavHostFragment
- 在碎片中添加跳转的代码,两种方式实现相同的功能
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
button1.setOnClickListener {
val controller = Navigation.findNavController(it)
controller.navigate(R.id.action_homeFragment_to_detailFragment)
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
button2.setOnClickListener(Navigation.createNavigateOnClickListener(R.id.action_detailFragment_to_homeFragment))
}
- 设置页面切换的过渡效果,my_nav_graph.xml -> 点线 -> Animation -> 设置enterAnim和exitAnim,可以弄默认动画
- 设置第二个碎片的setupActionBar
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val navHostFragment = supportFragmentManager.findFragmentById(R.id.fragmentContainerView) as NavHostFragment
val controller : NavController = navHostFragment.navController
NavigationUI.setupActionBarWithNavController( this,controller)
}
override fun onSupportNavigateUp(): Boolean {
val navHostFragment = supportFragmentManager.findFragmentById(R.id.fragmentContainerView) as NavHostFragment
val controller : NavController = navHostFragment.navController
return controller.navigateUp()
}
}
- 设置导航栏的标签,resourceFile->navigation(my_nav_graph)->点碎片->label 修改即可
效果展示