我有一个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()
并检索数据。我希望代码更优雅,也更正确。我要求听取更有经验的开发人员的意见,以便更好地使用。
答案 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我希望你能提供帮助。