2017-06-05 129 views
0

我一直在尋找並沒有找到嵌套片段與父片段通信的最佳方式。 Android文檔指出:親子片段子片段通信

所有片段到片段通信都是通過關聯的活動完成的。兩個碎片不應該直接通信。

假設我有一個畫廊的應用程序,有一個ViewPagerFragment(父)ImageFragment(子)用來顯示圖像全屏被點擊時。我需要從我的父級片段傳遞文件的ArrayList到子片段。什麼是正確的方法來做到這一點?

1)父片段創建ArrayList的一個getter和使用getParentFragment()子片段訪問此方法?

2)實現一個接口,並通過活動,但如何找到兒童片段如果它沒有ID的活動?

3),或在父片段使用:

ChildFragment fragment =(ChildFragment)getChildFragmentManager().findFragmentById(R.id.child_fragment_id);

,只需使用一個設置在子片段

但是,我又如何獲得childFragment的ID?

感謝大家提前

回答

1

我明白該片段到碎片通過活動通信是兄弟這是由同一個活動協調片段。

在這種情況下,siblign片段由父片段協調,所以我會說通信應該由父片段管理。

如果您正在使用片段直接使用ChildFragmentManager()。

如果您正在使用ViewPager,您將ChildFragmentManager傳遞給ViewPager,並將其傳遞給FragmentManager。

如果你必須通過一個List,我認爲ChildFragment最簡單的方法就是在它準備好通過調用ParentFragment上的方法來接收它時請求它。它可以通過getParentFragment()來實現它的instace。

我不確定哪裏是最安全的地方調用getParentFrament()來獲取列表,但你可以嘗試onCreateView(),在onActivityCreated(),在onResume()。

要調用返回列表的方法,可以將父代片段轉換爲您已擴展的特定片段類,否則可以使用返回列表的方法定義接口並使您的擴展父代片段實現它。

然後在子Fragment中,通過接口調用父級並調用該方法並獲取列表。

+0

因此,實際上有沒有標準呢?使用接口與使用getParent()相比沒有優勢? – LieForBananas

+0

使用接口更清晰且更靈活,因爲子片段可以在不知道其特定類的情況下從任何父片段獲取列表,甚至可以從Activity獲取。唯一的條件是Parent Fragment/Activity實現接口。 – Juan

+0

非常感謝您的解釋!我用getParent()方法去了,但我想我要實現一個接口! – LieForBananas

0

數據應該使用Bundle作爲參數傳遞給片段。所以只需通過Arraylist(序列化或其他)到您的子片段啓動時

+0

但這是絕對必要嗎? File類實現了Serializable,所以我必須使用它,但不是比通過getParent()訪問父級更慢嗎? – LieForBananas

1

如果你想與你的孩子片段溝通你的父母片段,你可以使用getParentFragment()方法從你的子片段。

public class ParentFragment extends Fragment { 

    public int getCount() { 
     return 10; 
    } 
} 

public class ChildFragment extends Fragment { 


    void doAction() { 
     Fragment parentFragment = getParentFragment(); 

     if(parentFragment instanceof ParentFragment) { 
      int count = ((ParentFragment) parentFragment).getCount(); 
     } 
    } 
} 
+0

非常感謝您的回答!我upvoted另一個答案,但我也使用你的代碼。再次感謝! – LieForBananas