今天我們來把側邊欄的功能完成,主要圍繞在 TasksActivity 上。
首先先看看完成後效果如何:
其實設置 Navigation Component 的整個過程中個人覺得 xml 的設置是最煩瑣的,設置完後在 Activity 這邊反而是比較簡單的。
先上程式碼:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_tasks)
initView()
}
private fun initView() {
// 設置側邊欄
setupNavigationDrawer()
setSupportActionBar(findViewById(R.id.toolbar))
val navController: NavController = findNavController(R.id.nav_host_fragment)
appBarConfiguration = AppBarConfiguration.Builder(
R.id.tasksFragment,
R.id.statisticsFragment
)
.setDrawerLayout(drawerLayout)
.build()
setupActionBarWithNavController(navController, appBarConfiguration)
findViewById<NavigationView>(R.id.nav_view)
.setupWithNavController(navController)
}
override fun onSupportNavigateUp(): Boolean {
return findNavController(R.id.nav_host_fragment).navigateUp(appBarConfiguration) ||
super.onSupportNavigateUp()
}
private fun setupNavigationDrawer() {
drawerLayout = findViewById<DrawerLayout>(R.id.drawer_layout).apply {
setStatusBarBackground(R.color.colorPrimaryDark)
}
}
下面稍微解釋一下具體完成的步驟:
首先調用 Activity.findNavController()
來獲得對 NavController
的引用,事實上這其實是一個官方提供的 Extension,查看 Source code 可以發現其實要取得 NavController
不外乎就三種方式:
接下來要提到一個類: NavigationUI
,這是 Navigation Component 裡提供包含 ActionBar 、側邊欄及底部 Navigation 一些支援方法的 class。
要想在預設的 ActionBar 裡支援 navigation ,那麼就需要使用 setupActionBarWithNavController()
這個方法,可以注意到我們需要傳入一個叫 AppBarConfiguration
的 class ,這是 NavigationUI 配置 AppBar 設定的 class ,裡面實現了 Builder 模式供我們指定顯示的 DrawerLayout 並建立 AppBarConfiguration
。
Navigation 的 ActionBar 預設進入 Fragment 時上方的 menu 紐會變成一個返回鍵,要想禁用這個效果可以在他的 Builder 裡放入要保持原樣的 Fragment xml ,這邊我們讓兩個 Fragment 的 Menu 按鈕都保持原樣,在 Builder 的 constructor 裡放入 R.id.tasksFragment
及 R.id.statisticsFragment
。
再來 override onSupportNavigateUp()
讓返回鍵觸發時的行為可以依據 AppBarConfiguration
的設定來變化。
最後調用 NavigationUI.setupWithNavController()
讓 NavigationView 可以在 Navigation Component 改變 destination 時也有相應的變化。
Navigation Component 大致上已完成,明天開始建立 App 的 DB 。