1.基本概念
navigation: 導航
navHost: 是一個容器或者控制器,裡面放fragment
fragment: 碎片化螢幕,一個activity可以有多個fragment,是一種容器,裡面可以放navHost
navController: 控制導航的邏輯,驅動導航圖
navGraph: 導航圖
2.導航代碼
基本設定完成之後,跳轉代碼:(以下代碼都是放在監聽事件中的)
//擷取navController
val navController = Navigation.findNavController(v)
//跳轉
navController.navigate(R.id.action_searchFragment_to_galleryFragment)
或者這樣寫:
//方式一
Navigation.findNavController(v).navigate(R.id.action_searchFragment_to_galleryFragment)
//方式二
Navigation.findNavController(requireActivity(), R.id.fragment).navigate(R.id.action_searchFragment_to_galleryFragment)
//方式三
Navigation.createNavigateOnClickListener(R.id.action_searchFragment_to_galleryFragment)
3.傳遞參數
//在一個fragment中設定要傳遞的參數
//TextView監聽事件
textViewCancel.setOnClickListener {
//要傳遞一個字元串“yourStr”
val yourStr = "yourStr"
val bundle = Bundle()
bundle.putString("YOUR_STR", yourStr)
//頁面跳轉
Navigation.createNavigateOnClickListener(R.id.action_searchFragment_to_galleryFragment, bundle)
}
//在另一個fragment中擷取參數(在onCreateView中或者其他)
val str = arguments.get("YOUR_STR") as String //as是類型轉換
此外,如果你使用了ViewModel來管理資料,就不需要在多個Fragment之間傳遞資料了,因為在不同fragment中請求回來的是一個ViewModel,能共享資料(fragment中應在onCreateView中,配置ViewModel和DataBinding),ViewModel的使用可以參考另一篇博文,附帶Demo
具體Navigation實操可以去看這個UP主的視訊,非常好:https://www.bilibili.com/video/av57646155(建議2倍食用)