天天看點

Jetpack元件Navigation導航的一些概念

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