2016-04-05 207 views
6

我有一個Activity和5 Fragment的。在第一個Fragment用戶輸入電話號碼。在最後(第五)Fragment我需要顯示此電話號碼,輸入其他字段並將所有數據發送到服務器。對於每個Fragment我使用單獨的演示者(MVP)。Android片段之間的片段數據

如何將數據從第一個片段傳遞到最後?

1)我不想傳遞所有鏈片段,因爲他們不需要這些數據。

2)如果將此數據存儲在主機Activity中,則需要在Fragment類中調用((SomeActivity)getActivity()).getUserData()並將此數據傳遞給Presenter。

3)我選擇了最後一種方法。我創建了單例UserData類。這是簡單的POJO類。我在第一個Fragment設置需要的數據中創建UserData的實例,並在最後的Fragment中使用它來檢索數據並添加缺少的字段。

但我不知道是單身正確的解決方案。因爲當用戶轉到另一個Activity時,我需要清除單例實例。 如果有更好的解決方案?

編輯

我想過EventBus。但我必須將數據從片段傳遞給演示者。現在我打電話給UserData.getInstance()並檢索數據。我希望代碼更優雅,也更正確。我要求聽到更多有經驗的開發人員的更好使用意見。

+0

你不能使用'SharedPref'嗎? –

+0

@RohitArya我不認爲這是比在Activity中保存數據更好的解決方案。我只需要這個數據發送到服務器,而不是很長時間 –

+0

然後單身人士將是一個很好的方法。 –

回答

2

由於模型住在(CustomerRegistrationWorkflow)活動我會做的ModellViewPresenter方式

class CustomerModel { 
    String phoneNumber 
} 

interface ICustomerOwner { 
    CustomerModel getCustomer() 
} 

class CustomerRegistrationWorkflowActivity extends Activity implements ICustomerOwner { 
    CustomerModel getCustomer() 
    ... 
} 

class CustomerContactDataFragment // fragment1 where you edit the phone number. 

class CustomerRegistrationSummaryFragment // fragment5 showing all data plus submit button) 

碎片可以通過調用

((ICustomerOwner) getActivity()).getCustomer() 
2

有很多方法可以將數據從一個類(碎片)發送到另一個類。

考慮到Fragment的生命週期問題。您可以毫不費力地使用Event bus。

class FragmentA { 
    Bus bus; 

    onCreate(){ 
     bus = new Bus(); 
    } 

    @Subscribe public void receiveMessage(String message) { 
     // TODO: Parse your message 
    } 

    onResume(){ 
     bus.register(this); 
    } 

    onPause(){ 
     bus.unregister(this); 
    } 
} 

class FragmentB { 

    onCreate(){ 
     bus.post("You have a message"); 
    } 
} 

有關整合otto here的更多信息。 或者還有很多其他的選擇。 https://greenrobot.github.io/EventBus/

+0

我想過EventBus。但是我爲我的問題寫了評論。我將不得不將數據從「碎片」傳遞給演示者。現在我在內部調用'UserData.getInstance()'並檢索數據。我希望代碼更優雅,也更正確 –

+2

如果您有任何問題。將其添加到您的問題中。你如何期待一些準備好你的問題和你的意見來給出答案? – amalBit

+0

我已更新我的問題 –

0

片段始終連接到包含它的Activity。因此,它可以輕鬆與活動進行交流。使用您的活動作爲溝通渠道或溝通媒介,您可以在連接到相同活動的片段之間創建溝通鏈接。

連接到Activity的片段可以通過getActivity()方法訪問Activity的實例,通過此實例,片段可以執行任務,如調用Activity的方法。

現在,要將數據從一個片段傳輸到另一個片段,可以在Activity中創建方法,並通過該方法將一些數據存儲在變量中。然後在其他片段中,您可以通過其他方法的幫助來訪問該變量的值。這裏可以使用getter和setter方法的概念。

有關活動的詳細信息和片段的交流,訪問鏈接:http://developer.android.com/guide/components/fragments.html#CommunicatingWithActivity

1

一個調用使用事件總線,其他優雅的解決方案 - 老好回調。 我的觀點是要避免「片段鏈」的情況 - 當一個片段直接調用另一個片段時。如果活動完全處理碎片替換,則它可以平等訪問所有碎片。因此,它可以使用回調來輕鬆地在它們之間傳遞數據。

在這種情況下,沒有看到MVP的任何問題。演示者使用回調將數據發送到其視圖(片段)。片段使用回調將數據發送到其活動。 Activity然後在片段管理器中查找第5個片段,並在第5個片段中更新/傳遞數據。

回調情況似乎比事件公交更爲穩健,但仍然有趣。

0

我有很多溝通 與模型關於將數據傳遞給活動或片段的問題。因此,我讓DataCache在任何地方傳遞任何對象。

這是超級簡單的例子。 Gihub : Android DataCache

片段發件人

public class FragmentA { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     String msg = "the phone number" 
     DataCache.getInstance().push(msg); 
    } 
} 

片段用於接收

public class FragmentB { 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 

      String msg = DataCache.getInstance().pop(String.class); 
     } 
    } 

嘗試:d我希望你能幫忙。