一、首先Activity布局中得有一个唤做androidx.navigation.fragment.NavHostFragment的<fragment>,导航玩耍的destination就再这里刷刷切换
<fragment
android:id="@+id/my_nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
app:defaultNavHost="true"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
app:navGraph="@navigation/mobile_navigation"></fragment>
- android:name="androidx.navigation.fragment.NavHostFragment" 和app:defaultNavHost="true" 把系统后退按钮连接到NavHostFragment
- app:navGraph="@navigation/mobile_navigation" 将HavHostFragment和导航图关联起来,导航图中定义了在NavHostFragment 中可以导航的所有destinatioin
二、看用什么进行导航
当然不管怎么玩都要先获取NavController的实例,而在NavHostFragment中就有一个NavController的实例。
所以在第一步中布局好的<fragment>就可以掏出来了:
val host = supportFragmentManager.findFragmentById(R.id.my_nav_host_fragment) as NavHostFragment?? : return
val navController = host.navController
妙不妙。
1)底部栏
这个简单一点先说这个。
-
布局有个BottomNavigationView
<com.google.android.material.bottomnavigation.BottomNavigationView android:id="@+id/bottom_nav" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="start" app:menu="@menu/bottom_menu"/>
-
在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)抽屉
- 布局文件
<androidx.drawerlayout.widget.DrawerLayout
...>
...
<com.google.android.material.navigation.NavigationView
.../>
</androidx.drawerlayout.widget.DrawerLayout>
- 抽屉要和两个东西发生勾当
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<NavigationView>(...)
sideNavView.setupWithNavController(navController)
}