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倍食用)