[英]Android pass data between Fragments
我有一個Activity
和5個Fragment
。 在第一個Fragment
用戶輸入電話號碼。 在最后一個(第五個) Fragment
我需要顯示此電話號碼,輸入其他字段並將所有數據發送到服務器。 對於每個Fragment
我使用單獨的Presenter(MVP)。
如何將數據從第一個片段傳遞到最后?
1)我不想傳遞所有片段鏈,因為它們不需要這些數據。
2)如果將此數據存儲在托管Activity
,則需要在Fragment
類中調用((SomeActivity)getActivity()).getUserData()
並將此數據傳遞給Presenter。
3)我選擇了最后一種方法。 我創建了單例UserData類。 這是簡單的POJO類。 我正在第一個Fragment
集中創建所需數據的UserData
實例,而不是在最后一個Fragment
使用它來檢索數據並添加缺少的字段。
但我不知道接近單身正確的解決方案。 因為我需要在用戶轉到另一個Activity
時清除單例實例。 如果有更好的解決方案?
編輯
我想到了EventBus。 但我必須將數據從Fragment傳遞給Presenter。 現在我在present中調用UserData.getInstance()
並檢索數據。 我希望代碼更優雅,也更正確。 我要求聽取更有經驗的開發人員的意見,以便更好地使用。
有很多方法可以將數據從一個類(Fragments)發送到另一個類。
考慮Fragment的生命周期問題。 你可以使用事件總線,沒有任何麻煩。
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的信息 。 或者還有很多其他選擇。 https://greenrobot.github.io/EventBus/
我會以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)
由於模型位於(CustomerRegistrationWorkflow)活動中,因此片段可以通過調用與模型進行通信
((ICustomerOwner) getActivity()).getCustomer()
一個人使用事件總線調用優雅的解決方案,另一個是舊的好的回調。 我的觀點是避免“片段鏈”的情況 - 當一個片段直接調用另一個片段時。 如果活動完全處理片段替換,則它可以平等訪問所有5個片段。 因此,它可以使用回調輕松地在它們之間傳遞數據。
在這種情況下,看不到MVP的任何問題。 Presenter使用回調將數據發送到其視圖(Fragment)。 片段使用回調將數據發送到其Activity。 然后Activity在片段管理器中找到第5個片段,並在第5個片段中更新/傳遞數據。
回調的情況似乎比事件總線更強大,但仍然是品味問題。
片段始終連接到包含它的Activity。 因此,它可以輕松地與Activity通信。 使用“活動”作為通信渠道或通信媒介,可以在附加到同一活動的片段之間創建通信鏈接。
連接到Activity的片段可以通過getActivity()方法訪問Activity的實例,並且通過此實例,fragment可以執行調用Activity的方法等任務。
現在,要將數據從一個Fragment傳輸到另一個Fragment,您可以在Activity中創建方法,並通過該方法將一些數據存儲在變量中。 然后在另一個片段中,您可以通過其他方法的幫助訪問該變量的值。 這里可以使用getter和setter方法的概念。
有關Activity和Fragment通信的更多信息,請訪問以下鏈接: http : //developer.android.com/guide/components/fragments.html#CommunicatingWithActivity
我有很多關於將數據傳遞給acitvity或碎片的問題。 結果,我讓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);
}
}
試試吧:DI希望你能幫忙。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.