2016-05-04 38 views
0

我想更好地理解接口,活動和片段的相互作用。如何在深嵌套鏈中的片段之間進行通信?

根據this link from the Android documentation

通常你會想要一個片段與另一個通信, 例如更改基於用戶事件的內容。全部 片段與片段之間的通信通過關聯的 活動完成。兩個碎片不應該直接通信。

他們舉這個例子:

public class HeadlinesFragment extends ListFragment { 
    OnHeadlineSelectedListener mCallback; 

    // Container Activity must implement this interface 
    public interface OnHeadlineSelectedListener { 
     public void onArticleSelected(int position); 
    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 

     // This makes sure that the container activity has implemented 
     // the callback interface. If not, it throws an exception 
     try { 
      mCallback = (OnHeadlineSelectedListener) activity; 
     } catch (ClassCastException e) { 
      throw new ClassCastException(activity.toString() 
        + " must implement OnHeadlineSelectedListener"); 
     } 
    } 

    ... 
} 

如何做到這一點的變化,如果你正在處理的片段的嵌套鏈?

例如,假設我有一個活動,其中包含一個片段,然後將該片段包含在另一個片段等方面予以明確:

Activity --> Fragment1 --> Fragment2 --> Fragment3 --> Fragment4 --> Fragment5 

我想明白了公認的最佳實踐執行以下操作:

假設Fragment5有一個EditText,並連接到它的OnClickListener的按鈕。我按下按鈕,該EditText的內容以某種方式發送到Fragment3中的函數。

我的問題:

我認爲我們需要在例如向上頂,這意味着活動歸途中前應實現該接口來定義Fragment5接口/聽衆喜歡,因爲根據文檔,活動應該傳遞碎片之間的信息。

但是現在,從這個活動中,我們如何將信息傳遞給Fragment3?

+0

使用'Bundle'來傳輸數據,當你用新的片段'setArguments'來替換舊的片段將會幫助你。 –

+0

@AnshulTyagi這與我的問題無關 - 我不是在問Factory模式。我在問你如何將一些孩子的信息從少數父母那裏轉移出去。 –

+0

您可以使用第三方庫,如Otto –

回答

1

該文檔是關於兄弟片段到片段通信的說法。他們應該通過父母的活動進行交流。

對於父子片段通信的子片段,可以直接進行通信。

((ParentFragment) getParentFragment).doSomething(); 

你可以有一個接口,讓父段執行它。然後,子片段可以通過接口與父片段通信,而不直接與另一個片段通信。

+0

但是,那麼這是否意味着子片段假定它被父片段包含(而不是父代活動),違反了模塊化原則? –

+0

對於兄弟父母,活動控制片段。活動是所有兄弟碎片的直接父項。所以我們可以將數據從一個片段路由到另一個片段。在嵌套片段的情況下是不可行的。活動不了解其孩子的孩子的碎片。 – Bob

+0

請參閱此處:http://www.apptrench.com/truly-reusable-fragments/#more-113 – Bob

相關問題