8.1.1 传统导航方式的痛点以及Navigation的优势传统导航方式的问题// 传统方式 - 使用 FragmentTransaction 手动管理导航classMainActivity:AppCompatActivity(){overridefunonCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)// 手动添加 FragmentsupportFragmentManager.beginTransaction().add(R.id.fragmentContainer,HomeFragment()).commit()}funnavigateToUserDetail(userId:String){// 手动管理 Fragment 切换valfragmentUserDetailFragment()valargsBundle()args.putString(userId,userId)fragment.argumentsargs supportFragmentManager.beginTransaction().replace(R.id.fragmentContainer,fragment).addToBackStack(UserDetail).commit()}funnavigateToSettings(){// 手动管理 Fragment 切换supportFragmentManager.beginTransaction().replace(R.id.fragmentContainer,SettingsFragment()).addToBackStack(Settings).commit()}overridefunonBackPressed(){// 手动处理返回键if(supportFragmentManager.backStackEntryCount0){supportFragmentManager.popBackStack()}else{super.onBackPressed()}}}传统方式的痛点痛点说明影响代码分散导航逻辑分散在各个地方难以维护和理解返回堆栈管理需要手动管理返回堆栈容易出现导航错误参数传递需要手动构建 Bundle类型不安全测试困难导航逻辑与业务逻辑耦合难以单元测试深层链接实现复杂需要大量代码// 使用 Navigation 组件 - 简化的导航classMainActivity:AppCompatActivity(){privatelateinitvarnavController:NavControlleroverridefunonCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)// 获取 NavControllernavControllerfindNavController(R.id.navHostFragment)// 设置导航图navController.setGraph(R.navigation.nav_graph)}funnavigateToUserDetail(userId:String){// 类型安全的导航navController.navigate(R.id.action_homeFragment_to_userDetailFragment,bundleOf(userIdtouserId))}funnavigateToSettings(){// 简单的导航navController.navigate(R.id.action_homeFragment_to_settingsFragment)}}Navigation 组件的优势优势说明可视化导航可视化的导航图直观展示应用导航结构类型安全使用 Safe Args类型安全的参数传递自动管理返回堆栈自动管理 Fragment 的返回堆栈深层链接支持**轻松实现深层链接动画支持内置转场动画支持易于测试导航逻辑与业务逻辑分离8.2 Navigation基本结构目的地、动作8.2.1 导航图的基本结构Navigation Graph XML 结构?xml version1.0 encodingutf-8?navigationxmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsandroid:idid/nav_graphapp:startDestinationid/homeFragment!-- 目的地1首页 --fragmentandroid:idid/homeFragmentandroid:namecom.example.app.ui.home.HomeFragmentandroid:labelHometools:layoutlayout/fragment_home!-- 动作导航到用户详情页 --actionandroid:idid/action_homeFragment_to_userDetailFragmentapp:destinationid/userDetailFragment/!-- 动作导航到设置页 --actionandroid:idid/action_homeFragment_to_settingsFragmentapp:destinationid/settingsFragment//fragment!-- 目的地2用户详情页 --fragmentandroid:idid/userDetailFragmentandroid:namecom.example.app.ui.user.UserDetailFragmentandroid:labelUser Detailtools:layoutlayout/fragment_user_detail!-- 参数用户 ID --argumentandroid:nameuserIdandroid:defaultValueapp:argTypestringapp:nullabletrue/!-- 动作返回首页 --actionandroid:idid/action_userDetailFragment_to_homeFragmentapp:destinationid/homeFragmentapp:popUpToid/homeFragmentapp:popUpToInclusivetrue//fragment!-- 目的地3设置页 --fragmentandroid:idid/settingsFragmentandroid:namecom.example.app.ui.settings.SettingsFragmentandroid:labelSettingstools:layoutlayout/fragment_settings!-- 动作返回首页 --actionandroid:idid/action_settingsFragment_to_homeFragmentapp:destinationid/homeFragmentapp:popUpToid/homeFragmentapp:popUpToInclusivetrue//fragment/navigation8.2.2 目的地类型Navigation 支持的目的地类型类型说明使用场景FragmentFragment 目的地最常用的目的地类型ActivityActivity 目的地跨 Activity 导航DialogDialog 目的地显示对话框NavGraph嵌套导航图复杂的导航结构不同目的地的示例navigationxmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:apphttp://schemas.android.com/apk/res-autoandroid:idid/nav_graphapp:startDestinationid/homeFragment!-- Fragment 目的地 --fragmentandroid:idid/homeFragmentandroid:namecom.example.app.ui.home.HomeFragmentandroid:labelHome/!-- Activity 目的地 --activityandroid:idid/mainActivityandroid:namecom.example.app.MainActivityandroid:labelMain Activity/!-- Dialog 目的地 --dialogandroid:idid/dialogFragmentandroid:namecom.example.app.ui.dialog.MyDialogFragmentandroid:labelDialog/!-- 嵌套导航图 --includeapp:graphnavigation/nested_graph//navigation8.2.3 动作Action的配置动作的属性fragmentandroid:idid/homeFragmentandroid:namecom.example.app.ui.home.HomeFragmentandroid:labelHome!-- 基本动作 --actionandroid:idid/action_home_to_detailapp:destinationid/detailFragment/!-- 带返回堆栈管理的动作 --actionandroid:idid/action_home_to_profileapp:destinationid/profileFragmentapp:popUpToid/homeFragmentapp:popUpToInclusivetrue/!-- 带转场动画的动作 --actionandroid:idid/action_home_to_settingsapp:destinationid/settingsFragmentapp:enterAnimanim/slide_in_rightapp:exitAnimanim/slide_out_leftapp:popEnterAnimanim/slide_in_leftapp:popExitAnimanim/slide_out_right/!-- 单实例导航 --actionandroid:idid/action_home_to_loginapp:destinationid/loginFragmentapp:launchSingleToptrue//fragment