Navigation小结

一、首先Activity布局中得有一个唤做androidx.navigation.fragment.NavHostFragment,导航玩耍的destination就再这里刷刷切换


  • android:name="androidx.navigation.fragment.NavHostFragment"app:defaultNavHost="true" 把系统后退按钮连接到NavHostFragment
  • app:navGraph="@navigation/mobile_navigation"HavHostFragment和导航图关联起来,导航图中定义了在NavHostFragment 中可以导航的所有destinatioin

二、看用什么进行导航

当然不管怎么玩都要先获取NavController的实例,而在NavHostFragment中就有一个NavController的实例。
所以在第一步中布局好的就可以掏出来了:

val host = supportFragmentManager.findFragmentById(R.id.my_nav_host_fragment) as NavHostFragment?? : return

val navController = host.navController

妙不妙。

1)底部栏

这个简单一点先说这个。

  • 布局有个BottomNavigationView

      
    
  • 在Activity中

      private fun setupBottomNav(navController: NavController){
          val bottomNav = findViewById...
          bottom?.setupWithNavController(navController)
      }
    
2)菜单
  • 用菜单进行navigate的话,自然先要填充菜单的,于是:
override fun onCreateOptionsMenu(menu:Menu?):Boolean{
    menuInflater.inflate(R.menu...)
    return true
}
  • 我们知道菜单是挂载actionbar上的,所以首先填充一个ActionBar。现在紧跟时代使用androidx了,所以用androidx.appcompat.widget.Toolbar来代替ActionBar:
setSupportActionBar(toolbar)
  • 接下来ActionBar 和菜单就要发生一些故事了
var appBarConfiguration = AppBarConfiguration(setOf(...))

appBarConfiguration用来告诉ActionBar,哪些destinatioin是根部,显示根部时,actionbar不显示返回按钮,其他destination会显示返回按钮的。

private fun setupActionBar(navController: NavController, appBarConfiguration: AppBarConfiguration){
    setupActionBarWithNavController(navController, appBarConfiguration)
}

如果菜单中有些item没有映射destination而又想处理,重写onOptionsItemSelected 就好了。

3)抽屉
  • 布局文件

    ...
    

  • 抽屉要和两个东西发生勾当
    1)ActionBar 和 DrawerLayout(抽屉布局)
    2)NavigationController 和 NavigationView(导航View)

ActionBar
在传统菜单部分中有一个唤做AppBarConfiguration的东西,哪个时候是这样初始化的:

appBarConfiguration = AppBarConfiguration(setOf(...))

现在需要让drawerLayout和AppBar联系起来,就要改为:

appBarConfiguration = AppBarConfiguration(setOf(...), drawerlayout)

然后就该导航View 和 NavController了:

private fun setupDrawerNav(navController: NavController){
    val sideNavView = findViewById(...)
    sideNavView.setupWithNavController(navController)
}

你可能感兴趣的:(Navigation小结)