2017-07-29 109 views
0

這裏有很多關於片段通信的問題,但通常是關於從活動獲取數據並將數據發回活動的問題,通常從片段開始。 但我想知道什麼是最好的方法發送數據從活動到片段,當你創建片段時無法做到這一點?爲了澄清,讓我們假設一個應用程序有兩個片段,可以使用(不能)必須的一些數據來改善用戶體驗,但獲取這些數據是昂貴的。因此,在主要活動中使用LoaderAsyncTask在活動中獲取此數據,同時自行創建碎片。現在,在Activity中異步準備好數據時,我們需要將這些數據發送到Fragments。什麼是最好的方法呢?我想到了這樣做的一種方式,我想知道這種方法是否存在問題。另一個片段通信

我們使用 onAttach發送片段活動,並檢查

1,在片段,如果任何數據已經閱讀:

@Override 
public void onAttach (Activity activity) { 
    MyActivity act = (MyActivity)activity; 
    act.addFragment(this); 
    Data data = act.getData(); 
    if (data != null) { 
     setAdditionData(data) 
    } 
} 

2,並在活動商店WeakReference到碎片:

private ArrayList<WeakReference<Fragment>> mFragments = new ArrayList<>(); 
... 
public void addFragment(Fragment frag) { 
    WeakReference<Fragment> f = new WeakReference<Fragment>(frag); 
    mFragments.add(f); 
} 

public Data getData() { 
    return mData; 
} 

public void updateFragmentsData() { 
    for (Iterator<WeakReference<Fragment>> iterator = mFragments.iterator(); iterator.hasNext();) { 
     WeakReference<Fragment> wf = iterator.next(); 
     Fragment f = wf.get(); 
     if (f != null) { 
      f.setAdditionData(mData); 
     } else { 
      iterator.remove(); 
     } 
    } 
} 

現在,當片段重疊時,它將自身添加到活動中的片段列表中,並檢查數據是否已準備就緒,如果準備就緒,它將使用該數據。另一方面,當數據在活動中異步就緒時,它可以調用updateFragmentsData()來更新所有片段數據。

我不知道這種方法是正確的還是在某些情況下可能不正確?任何想法?有沒有更好的方法來通知主要活動的碎片?

順便說一下,是否可以使用處理程序/消息進行片段之間的通信?作爲另一種方法?

最好的問候

回答

0

我可以想到三種方法。

  1. 使用監聽器。在活動中編寫接口以將其用作偵聽器。該片段在適當的時候實現了接口並註冊和註銷爲一個監聽器(比如onCreateView和onDestroyView)。
  2. 這是我的最愛。我希望DataBinding越來越受歡迎,它可以用來解決這個問題。假設你爲片段佈局定義了一個特定的模型。現在在模型中使用ObservableFields。將此模型傳遞給您的數據綁定變量。現在從活動或片段本身更改此對象,更改將反映在視圖中。
  3. 新推出的ViewModels。我將在下一個項目中使用它們。
+0

哦,這個ViewModels看起來非常酷。他們可以處理片段/活動數據傳遞良好。 :) 非常感謝。 – Afshin