2020 年 4 月 29 日,發佈了 androidx.fragment:fragment:1.3.0-alpha04 的版本,改版本棄用了以前fragment的傳輸數據方式,添加了新的api,以下圖
android
之前的Fragment傳輸數據應該都用過,獲取fragment實例,arguments,回調,eventbus等,方式的確多樣化,之前大多數傳遞都須要持有實例,這是很危險的git
可是谷哥已經推新了,如今推薦使用新的api去傳遞數據,在版本1.3.0-alpha04 中新增了result api去操做github
很簡單,假如你要在兩個fragment之間傳遞,須要用到兩個api,一個發送,一個接收,這裏作一個測試,首先啓動一個SplashFragment,在啓動頁結束的時候發送一個數據過去HomeFragmentapi
別忘了添加引用測試
implementation "androidx.fragment:fragment-ktx:1.3.0-rc02"
發送時3d
接收時code
這樣一看是否是一目瞭然了,這兩個方法能夠直接使用,kotlin自帶的api,點進去能夠看到源碼blog
發現是parentFragmentManager中方法,只是kotlin簡化了而已生命週期
如今運行一波,啓動頁結束進入HomeFragment,而後會在同時收到咱們發過去的數據get
上面是兩個Fragment同級的傳遞方式,那若是換個場景,Fragment是子集的時候,監聽就不同了,這裏新建一個TabFragment,而後TabFragment裏面有兩個子tab,如今子tab要傳遞數據到TabFragment中
首先仍是同樣的,在TabFragment裏註冊好接收
這裏不是直接用parentFragmentManager了,須要用childFragmentManager去註冊了,否則會失效,而後發送仍是同樣,這裏在子tab裏顯示一個textview,點擊textview的時候發送一條數據過來
而後運行一波
在換一個場景,若是從TabFragment中傳遞數據到子tab中,子tab去接收,這裏在TabFragment中添加一個懸浮按鈕,點擊按鈕傳遞數據到子tab中
這時候發送就不同了,由於是發送到子tab中,因此須要使用childFragmentManager去發送
在運行一波看看
這裏須要注意註冊的key,不要重複註冊,不然只會有一個能接收到數據
這種方式不持有對方引用,避免了不少未知的問題,自帶生命週期的監聽,會在銷燬的同時移除監聽