-1

我有一個Activity A,它包含一個Fragment B,其中包含另一個Fragment C,其中包含一個包含一些列表項的ListView一個或多個接口?

列表項如何與Activity進行通信?我必須逐級傳遞Activity參考級別,直到它到達列表項目?我是否必須創建多個接口並讓通信逐級回傳到Activity

更新:

閱讀@Barend的回答之後,這是我的代碼:Fragment C有一個接口CFragment B具有接口B,其延伸CActivity A implements B,這意味着它也實現了C中的方法。在Fragment C中,我有一個mListener字段,該字段在onAttach(Context)生命週期回調中分配給getActivity()

+0

您可以在作業中使用'BroadCastReceiver'作爲內部類。即當一個listitem被點擊時發送一個廣播,接收者可以收聽,如果你想使用接口,那麼你將不得不創建一個頻道,即通過創建多個接口 –

+0

這可能是一個幫助你http:// simpledeveloper。 com/how-to-communicate-fragments-and-activities/ –

+0

@SatyenUdeshi感謝您的評論。它使事情更清晰。 – Jonas

回答

1

如果你想在乾淨的面向對象的結構,你可以使用多個接口,給回調接口相同的嵌套結構片段,像這樣:

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來實現,這種方式通常比較簡單,但公認不太常見。

+0

我推薦使用getParentFragment(與getChildFragmentManager()配合使用)和getTargetFragment(使用DialogFragment)。在我的情況下,如果第一個片段沒有太大的作用,我會把它的用戶界面放到活動中。 –

+0

@Barend:我理解你的答案的最後一部分(其他方式部分)如下:如果我的內部片段X位於外部片段Y內部,試圖使活動實現它的(X)接口,那麼人們誰使用外部片段Y可能不知道他需要使活動實現X接口。這是一個正確的理解? – Jonas

+0

@Jonas是的,我相信你理解正確。 – Barend

1

如果需要從fragmentActivity溝通,你可以得到你Activity任何嵌套Fragment只需使用getActivity()。 如果您需要從Activity得到Fragment訪問使用它的FragmentManager

FragmentManager manager = getFragmentManager(); 
Fragment f = manager.findFragmentByTag("Your fragment tag"); 
+0

看起來這會使'Fragment'與'Activity'緊密結合。 – Jonas