天天看點

activity 點選後傳遞資料給fragment_如何用更好的方式在 Activity 或 Fragment 之間傳遞以及傳回資料?...

activity 點選後傳遞資料給fragment_如何用更好的方式在 Activity 或 Fragment 之間傳遞以及傳回資料?...

前言

我們都知道在Activity之間傳遞資料很繁瑣,為了簡化,很多人都是使用過EventBus,可EventBus在追蹤問題時反而束手無策,反而增加調試時間,那我們能不能找一個折中的方案,又能簡單的實作,又能容易追查問題呢?

下面請允許我介紹一下最新的方式在實作資料的Result

一、先來看看以前我們都是如何做的

override 
           

以前,我們都是這樣處理Result,分别定義不同的RequestCode,然後根據這個值來比對資料。我們再來看看新的方式,然後做個比較

二、Activity Result新方式

step one: 加入依賴

implementation 
           

step two: 編碼

class 
           

繼承ActivityResultContract,并覆寫createIntent和parseResult函數,這倆函數很好了解,一個負責建立Intent,一個負責解析Result,

那接下來如何使用呢?
class 
           

隻需要調用registerForActivityResult函數,然後在點選事件中,用其傳回值調用launch函數即可

class 
           
代碼運作效果
activity 點選後傳遞資料給fragment_如何用更好的方式在 Activity 或 Fragment 之間傳遞以及傳回資料?...
這麼實作有什麼優點呢?
  • 一方面針對ResultActivity的啟動傳參數,更加的具體,啟動該Activity,不必要關心postId的key是什麼,這樣在其他頁面需要調用的時候,也隻是傳入參數,這樣對于以後key的重構就不會影響其他部分
  • 另一方面不再需要定義RequestCode,也不錯哦
  • 其實它還有個優勢哦,看過源碼才知道,其實它是結合了lifecycle,在頁面銷毀的時候,會自動将生成的RequestCode給remove掉

Fragment Result新方式

一張圖看清整個通訊的過程
activity 點選後傳遞資料給fragment_如何用更好的方式在 Activity 或 Fragment 之間傳遞以及傳回資料?...
Fragment B 使用 FragmentManager 将資料發送到 Fragment A

在生成結果的 Fragment B 中,必須使用相同的 requestKey 在同一 FragmentManager 上設定結果。您可以使用 setFragmentResult() API 來完成此操作:

button
           

在Fragment A中注冊回調結果監聽

FragmentManager
           

這種情況需要注意的就是requestKey,在出去和傳回的時候都要保持一緻。還有一種情況是,如果有多個資料傳遞,隻會接收到最新的值,更Activity一樣,在DESTROYED時,會自動取消listener,

以上是同級Fragment的傳遞,如果是父子級呢?
activity 點選後傳遞資料給fragment_如何用更好的方式在 Activity 或 Fragment 之間傳遞以及傳回資料?...

如圖所示,需要在Parent Fragment 調用 childFragmentManager來注冊listener

override 
           
這麼實作有什麼優點呢?
  • 完全解耦,無需依賴對方
  • 當ON_DESTROY時自動登出
文章和往期幹貨已被收錄至專欄【 進擊的Android秃頭 】, 喜歡 的或者 覺得我寫的還行 的朋友 可以點一波雙關(關注作者+關注專欄)喲。
作者: @程式寫到秃 專欄:

“下方卡片”【

進擊的Android秃頭

進擊的Android秃頭​zhuanlan.zhihu.com

activity 點選後傳遞資料給fragment_如何用更好的方式在 Activity 或 Fragment 之間傳遞以及傳回資料?...
activity 點選後傳遞資料給fragment_如何用更好的方式在 Activity 或 Fragment 之間傳遞以及傳回資料?...

繼續閱讀