2012-03-07 56 views
23

我知道當你第一次實例化一個片段時,你可以使用setArguments(Bundle)來傳遞參數並使用在片段中檢索它們。將參數添加到活動後,是否可以將參數傳遞給片段?

但是,在我的應用程序中,我有一些片段會在被添加到活動後分離並附加幾次。在重新附加之前,我可能需要傳遞參數片段來修改其內容,然後再重新附加它。第一次顯示片段時,我可以使用setArguments,但在後續的場合不起作用。在這種情況下savedInstanceState將不起作用,因爲在分離片段之前我不知道參數的值。

我知道我可以實現一個方法,我會在附加設置參數的片段之前調用,但它看起來像這是可能已經在API中的東西,我只是沒有看到它。

是否有內置的東西可以讓我做到這一點,還是我必須自己實現?爲了記錄,我正在使用支持包(v4)。

非常感謝!

+0

你是什麼意思重新附加?碎片將只附加到一次活動(AFAIK),如果它從活動中分離出來,它將被銷燬。你的意思是當用戶點擊後退按鈕片段返回到佈局? – 500865 2012-03-07 23:06:42

回答

12

你可以在你的片段上公開一個方法,設置你想要傳遞給它的任何東西。要打電話給你,你可以通過標記從後臺堆棧中檢索片段,或者從您要調用的任何位置引用實例引用。

這對我來說很好,雖然你需要在空檢查方面有所防禦,以及瞭解片段在附加或重新啓動時所經歷的生命週期。

從我可以告訴有什麼API中...

更新:這仍然是正確的和工作得很好。我發現一旦這個更復雜,它就會更簡單,更容易使用諸如Otto事件總線之類的東西。強烈推薦imho。

+0

我傳遞的參數非常微不足道 - 它實際上並不是將內容添加到片段中,而是片段將基於其值顯示/隱藏內容。這似乎有點過於直截了當,這讓我想也許是因爲我正在做的是API。可能不會。謝謝您的幫助! – 2012-03-08 17:10:13

2

在參數被添加到活動之後,是否可以將參數傳遞給片段?


但是,如果你正在尋找辦法與活動傳達給其一個片段捆綁,你可以做到這一點@manfred提到或描述的其他方式的方式Documentation

還有另一種有趣的方式來讓兩個片段相互溝通。這是通過使用setTargetFragmentgetTargetFragment方法。在這裏,如果fragmentB會影響fragmentA,你會的fragmentBfragmentA當改變需要從內部fragmentB更新fragmentA,您將獲得由 ((fragmentA) getTargetFragment())對它的引用和訪問的fragmentA的方法來更新它setTargetFragment

希望它有幫助。祝你好運。

+0

他並不是在詢問與片段的交流,他問的是如何改變參數,一旦設置爲片段 – 2015-09-01 05:59:19

+0

你的「否」是非常誤導和不正確的,對於OPs問題的答案,你也引用了,完全由@ user3978046回答高於 – 2015-11-09 01:01:21

19

是的,如果你已經調用setArguments(bundle)之前你的片段變得活躍。然後從那裏你的片段有一個你可以更新的包。爲避免您的問題,您必須更新原始包,並且不得再次調用setArguments。所以,下面您最初的片段建設,修改片段論點如下代碼

frg.getArguments().putString("someKey", "someValue"); 

的參數,然後將在你的片段可用,將堅持並在方位的變化和這樣的恢復。

請注意,在佈局中通過xml創建片段時,此方法也很有用。通常,人們無法在這樣的片段上設置參數;爲了避免這種限制的方式是創建創建參數捆綁像這樣一個無參數的構造函數:您的活動的onCreate方法

public MyFragment() { 
    this.setArguments(new Bundle()); 
} 

後來地方,那麼你會怎麼做:

FragmentManager mgr = this.getSupportFragmentManager(); 
Fragment frg = mgr.findFragmentById(R.id.gl_frgMyFragment); 
Bundle bdl = frg.getArguments(); 
bdl.putSerializable(MyFragment.ATTR_SOMEATTR, someData); 

這會將數據進入參數包,然後可以在您的片段中進行編碼。

+0

雅,但是有沒有辦法讓你的片段注意到你已經爲這個包添加了參數?我想我可以添加參數,然後在活動可以調用的片段上公開一個方法,強制它重新檢查參數。問題在於活動不知道片段處於生命週期的哪個階段。 – Glaucus 2016-09-14 21:15:25