一、首先Activity布局中得有一個喚做androidx.navigation.fragment.NavHostFragment的<fragment>奢驯,導(dǎo)航玩耍的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" 把系統(tǒng)后退按鈕連接到NavHostFragment
- app:navGraph="@navigation/mobile_navigation" 將HavHostFragment和導(dǎo)航圖關(guān)聯(lián)起來,導(dǎo)航圖中定義了在NavHostFragment 中可以導(dǎo)航的所有destinatioin
二朝墩、看用什么進行導(dǎo)航
當然不管怎么玩都要先獲取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”ǎ現(xiàn)在緊跟時代使用androidx了挎峦,所以用androidx.appcompat.widget.Toolbar來代替ActionBar:
setSupportActionBar(toolbar)
- 接下來ActionBar 和菜單就要發(fā)生一些故事了
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>
- 抽屜要和兩個東西發(fā)生勾當
1)ActionBar 和 DrawerLayout(抽屜布局)
2)NavigationController 和 NavigationView(導(dǎo)航View)
ActionBar
在傳統(tǒng)菜單部分中有一個喚做AppBarConfiguration的東西税弃,哪個時候是這樣初始化的:
appBarConfiguration = AppBarConfiguration(setOf(...))
現(xiàn)在需要讓drawerLayout和AppBar聯(lián)系起來纪岁,就要改為:
appBarConfiguration = AppBarConfiguration(setOf(...), drawerlayout)
然后就該導(dǎo)航View 和 NavController了:
private fun setupDrawerNav(navController: NavController){
val sideNavView = findViewById<NavigationView>(...)
sideNavView.setupWithNavController(navController)
}