如果你想在乾淨的面向對象的結構,你可以使用多個接口,給回調接口相同的嵌套結構片段,像這樣:
public class InnerFragment extends Fragment {
public interface Callback {
// Defines all callback methods required by inner fragment
}
}
public class OuterFragment extends Fragment {
public interface Callback
extends InnerFragment.Callback {
// Defines all callback methods required by outer fragment
// Inherits all callback methods required by inner fragment
}
}
public class HostActivity extends Activity
implements OuterFragment.Callback {
// implements the callback methods of both fragments, but
// references only the outer fragment
}
你付出的代價是,這會讓你寫比如果您使用廣播接收機,或事件總線更多的代碼。
爲什麼這是最乾淨的可能方法?分離關切和最不瞭解的原則。該活動僅與外部片段直接交互;內部片段是外部片段的實現細節。
對於內部片段的工作,活動必須實現內部回調。這是通過將外部回調擴展到內部回調來實現的。
如果您繪製出「X分量有分量Y的知識」的圖表,你會得到這樣的:
Activity --> OuterFragment --> InnerFragment
這是乾淨的。組件是獨立式和獨立和它們的依賴關係是顯式和(大部分)編譯器檢查。 InnerFragment是外部片段的「黑匣子」實現細節,它可以直接在不同的上下文中使用,如果回調沒有改變,它們可以重構而不觸及活動(它們可能從一個片段的回調移動到其他在某些情況下)。
而如果你不使用回調擴展回調伎倆,你得到這個組件的知識圖:
Activity --> OuterFragment --> InnerFragment
--------------------> InnerFragment
在這種情況下,內部片段回調的依賴是不可見的程序員。如果你包含片段X,你期望不得不實現X.Callback,但不明顯的是你也需要Y.Callback。由於這通常是通過片段的onAttach()
方法中的類型強制實施的,因此只有在運行時得到ClassCastException
之後纔會發現。
順便說一句,我沒有嵌套片段的風扇(DialogFragment
是好的,但我懷疑嵌套常規片段)。我認爲片段增加了很多複雜性,而且我還沒有真正遇到過這樣的情況:對於小屏幕尺寸和移動應用程序的單個任務重點來說,這是必需的,甚至是可以理解的。使用自定義ViewGroup
通常會更好。我建議僅使用片段作爲支持平板電腦上並排佈局的手機上堆疊佈局的一種方式,甚至可以使用自定義ViewGroup
s來實現,這種方式通常比較簡單,但公認不太常見。
您可以在作業中使用'BroadCastReceiver'作爲內部類。即當一個listitem被點擊時發送一個廣播,接收者可以收聽,如果你想使用接口,那麼你將不得不創建一個頻道,即通過創建多個接口 –
這可能是一個幫助你http:// simpledeveloper。 com/how-to-communicate-fragments-and-activities/ –
@SatyenUdeshi感謝您的評論。它使事情更清晰。 – Jonas