9

android開發人員教程建議我使用片段的宿主活動來傳遞數據和什麼,爲什麼有set/get target片段方法?我們應該使用setTargetFragment()嗎?我認爲片段不應該彼此溝通

我到目前爲止的應用程序包含一個主機活動和一個片段,它有一個啓動DialogFragment的按鈕,其中有一個啓動另一個DialogFragment的按鈕。使用setTargetFragment/getTargetFragment已經使這個整個考驗有點混亂,所以我正在考慮重新實現,讓我的主要活動通過我的主要片段的自定義界面處理DialogFragment.show方法。

這是否是正確的思維方式?或者在使用setTargetFragment時沒有傷害?任何人都可以提供使用它的好的和壞的例子嗎?

回答

5

我不認爲使用setTargetFragment存在隱式傷害,但是,我只會在非常特定的情況下使用它。例如,如果目標片段是,那麼只有纔會被片段使用(考慮到對象重用,並設計您的類在可能的情況下可重用),並且即使如此,也要謹慎。

通過使用它們太多,你會最終看到你所看到的 - 難以遵循和維護的令人困惑的代碼。首先,通過整理活動中的所有內容,您可以維護一個「扁平」的層次結構,並且易於遵循和維護。

我認爲使用setTargetFragment或不使用setTargetFragment的決定是一種編碼風格/哲學風格,它具有智慧和經驗,它「感覺」是對還是錯。也許在你的情況下,通過證據表明你在質疑你的舊代碼,你正在獲得這種智慧:)

+0

我想我的膽量告訴我是正確的。感謝您的建議。現在我將開始重新實現...:P –

+1

如果通過回調接口使用setTargetFragment,則不會將碎片相互耦合 - 但是如果您投射到特定碎片,那麼我會認爲這是一個糟糕的主意,因爲它引入了緊密耦合。 – AgentKnopf

6

此外,你可能最終會在片段管理器中找不到目標片段。如果在輪換之後(或其他配置更改),則在調用者片段將被添加時,您的目標片段將不會被讀取到片段管理器。

想象一下,你有某種形式的確認片段你從MainFragment是這麼加:

ConfirmationFragment frag = new ConfirmationFragment(); 
frag.setTargetFragment(this, 0); 
getFragmentManager().beginFragmentTransaction().add(R.id.container, frag).commit(); 

現在一些確認按鈕點擊你MainFragment調用一個方法調用:

((MainFragment)this.getTargetFragment()).onUserSelectedGoodButton(); 

這是漂亮和簡單,但如果你將旋轉屏幕,由於某種原因ConfirmationFragment將被添加到FragmentManager之前MainFragment,異常將被拋出,stat在片段管理器中找不到目標片段

+0

您只需將目標片段保存在onSaveInstanceState中,然後如果savedInstance爲!= null,則可以在onCreate中檢索它。我隱約記得讀過,如果你替換了一個片段,它可能會有問題,而不是隱藏原始片段,並在其上添加新的片段。 – AgentKnopf