簡體   English   中英

Android在Fragments之間傳遞數據

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM