Android在Fragments之间传递数据

时间:2016-04-05 07:18:33

标签: java android android-fragments android-activity mvp

我有一个Activity和5个Fragment。在第一个Fragment用户输入电话号码。在最后一个(第五个)Fragment我需要显示这个电话号码,输入其他字段并将所有数据发送到服务器。对于每个Fragment我使用单独的Presenter(MVP)。

如何将数据从第一个片段传递到最后?

1)我不想通过所有片段链,因为他们不需要这些数据。

2)如果将此数据存储在托管Activity中,则需要在((SomeActivity)getActivity()).getUserData()类中调用Fragment并将此数据传递给Presenter。

3)我选择了最后一种方法。我创建了单例UserData类。这是简单的POJO类。我在第一个UserData设置所需数据中创建Fragment的实例,而不是在上一个Fragment中使用它来检索数据并添加缺少的字段。

但我不知道接近单身正确的解决方案。因为我需要在用户转到另一个Activity时清除单例实例。 如果有更好的解决方案?

修改

我想到了EventBus。但我必须将数据从Fragment传递给Presenter。现在我在当前调用UserData.getInstance()并检索数据。我希望代码更优雅,也更正确。我要求听取更有经验的开发人员的意见,以便更好地使用。

5 个答案:

答案 0 :(得分:2)

有很多方法可以将数据从一个类(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 here的更多信息。 或者还有很多其他选择。 https://greenrobot.github.io/EventBus/

答案 1 :(得分:2)

我会用ModellViewPresenter方式

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

由于模型位于(CustomerRegistrationWorkflow)活动中,因此片段可以进行通信 与模型通过调用

    @PrePersist
    void preInsert() {
       PrePersistUtil.pre(this);
    }

答案 2 :(得分:1)

一个人使用事件总线调用优雅的解决方案,另一个是旧的好的回调。 我的观点是避免“片段链”的情况 - 当一个片段直接调用另一个片段时。如果活动完全处理片段替换,则它可以平等访问所有5个片段。 因此,它可以使用回调轻松地在它们之间传递数据。

在这种情况下,看不到MVP的任何问题。 Presenter使用回调将数据发送到其视图(Fragment)。片段使用回调将数据发送到其Activity。然后Activity在片段管理器中找到第5个片段,并在第5个片段中更新/传递数据。

回调的情况似乎比事件总线更强大,但仍然有品味。

答案 3 :(得分:0)

片段始终连接到包含它的Activity。因此,它可以轻松地与Activity通信。使用“活动”作为通信渠道或通信媒介,您可以在附加到同一活动的片段之间创建通信链接。

连接到Activity的片段可以通过getActivity()方法访问Activity的实例,使用此实例,fragment可以执行调用Activity的方法等任务。

现在,要将数据从一个Fragment传输到另一个Fragment,您可以在Activity中创建方法,并通过该方法将一些数据存储在变量中。然后在另一个片段中,您可以通过其他方法的帮助访问该变量的值。这里可以使用getter和setter方法的概念。

有关活动和片段通信的详细信息,请访问以下链接:http://developer.android.com/guide/components/fragments.html#CommunicatingWithActivity

答案 4 :(得分:0)

我有很多关于将数据传递给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);
        }
    }
尝试一下:D我希望你能提供帮助。