Android日志—Navigation

Posted 程序员-吴彦祖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android日志—Navigation相关的知识,希望对你有一定的参考价值。

Navigation简介

Navigation是一个框架,用于android应用中的“目标”之间的导航,该框架提供一致的API,无论目标是作为Fragment、Activity还是其他组件的实现。

  • NavGraph 在一个集中位置包含所有导航相关信息的XML资源
  • NavHost 显示导航图中目标的空白容器,导航组件包含一个默认NavHost实现(NavHostFragment),可显示Fragment目标
  • NavController 在NavHost中管理应用导航的对象。当用户在整个应用中移动时,NavController会安排NavHost中目标内容的交换。

声明依赖项

def nav_version声明版本号,下方根据需要导入不同的依赖

dependencies 
  def nav_version = "2.3.5"

  // Java language implementation
  implementation "androidx.navigation:navigation-fragment:$nav_version"
  implementation "androidx.navigation:navigation-ui:$nav_version"

  // Kotlin
  implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
  implementation "androidx.navigation:navigation-ui-ktx:$nav_version"

  // Feature module Support
  implementation "androidx.navigation:navigation-dynamic-features-fragment:$nav_version"

  // Testing Navigation
  androidTestImplementation "androidx.navigation:navigation-testing:$nav_version"

  // Jetpack Compose Integration
  implementation "androidx.navigation:navigation-compose:2.4.0-alpha04"


Safe Args

用于在目的地之间传递数据

buildscript 
    repositories 
        google()
    
    dependencies 
        def nav_version = "2.3.5"
        classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"
    


这里我使用的是kotlin语言,所以导入 apply plugin: “androidx.navigation.safeargs.kotlin”

实际应用

这里通过一个简单的美食项目来对navigation做更深层次的理解

创建fragment(两种)
第一种
使用系统提供的。根据需要选择,这里我使用Blank,之后删除多余的代码行。

image.png

第二种
自己创建
创建相应的xml文件
创建类,并且与对应xml文件关联


创建navigation

创建对应的资源

点击则将创建的fragment添加进navigation中

将nav_host添加到容器中,容器放在activity_main.xml中

添加BottomNavigationView

添加图片资源

创建底部菜单资源

如下,以有效果

下面将菜单设置到底部
添加控件

设置menu资源

NavController切换配置

通过NavController实现点击菜单能够实现切换页面

代码中有关于ViewBinding的使用,暂不做详解

class MainActivity : AppCompatActivity() 
    lateinit var navController: NavController
    private var _binding: ActivityMainBinding? = null
    val binding get() = _binding!!

    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)

       _binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        //1、找到NavHostFragment
        val navHostFragment = supportFragmentManager.findFragmentById(R.id.containerFragment)
                as NavHostFragment

        //2、找到NavController
        navController = navHostFragment.navController

        //3、BottomNavigationView和NavController关联
        binding.bottomNavigationView.setupWithNavController(navController)


        //4、ActionBar与NavController关联
        val appBarConfiguration = AppBarConfiguration(
            setOf(R.id.recipesFragment,R.id.jokeFragment,R.id.favoritesFragment)
        )

        setupActionBarWithNavController(navController,appBarConfiguration)
    

    override fun onDestroy() 
        _binding = null
        super.onDestroy()
    


以上是关于Android日志—Navigation的主要内容,如果未能解决你的问题,请参考以下文章

踩坑!Android Jetpack组件间库之Navigation

Android Navigation Url Deep Link Back to Previous App

Android 解决XXX Layout leaked 使用Navigation 踩坑 XML内存泄漏

jetpack compose 接收返回参数

IllegalArgumentException:无法从当前目的地 Destination [Navigation Error] 找到导航操作/目的地

Navigation 在fragment之间用bundel传递数据