Java Android在片段之间传递数据
我有一个Java Android在片段之间传递数据,java,android,android-fragments,android-activity,mvp,Java,Android,Android Fragments,Android Activity,Mvp,我有一个活动和5个片段。在第一个片段上用户输入电话号码。在最后(第五个)Fragment中,我需要显示此电话号码,输入其他字段,并将所有数据发送到服务器。对于每个片段我使用单独的演示者(MVP) 如何将数据从第一个片段传递到最后一个片段 1) 我不想遍历所有的片段链,因为它们不需要这些数据 2) 如果将此数据存储在宿主活动中,我需要调用((SomeActivity)getActivity()).getUserData()内片段类并将此数据传递给演示者 3) 我选择了最后一种方法。我已经创建了si
活动
和5个片段
。在第一个片段上
用户输入电话号码。在最后(第五个)Fragment
中,我需要显示此电话号码,输入其他字段,并将所有数据发送到服务器。对于每个片段
我使用单独的演示者(MVP)
如何将数据从第一个片段传递到最后一个片段
1) 我不想遍历所有的片段链,因为它们不需要这些数据
2) 如果将此数据存储在宿主活动中
,我需要调用((SomeActivity)getActivity()).getUserData()
内片段
类并将此数据传递给演示者
3) 我选择了最后一种方法。我已经创建了singleton UserData类。这是一个简单的POJO类。我在第一个Fragment
中创建了UserData
的实例,然后在最后一个Fragment
中使用它来检索数据并添加缺少的字段
但我不知道单例方法是否正确。因为当用户转到另一个活动时,我需要清除singleton实例。
如果有更好的解决方案
编辑
我想到了EventBus。但我必须将数据从片段传递给演示者。现在我在present和retrieve数据中调用UserData.getInstance()。我希望代码更优雅,也更正确。我想听听更有经验的开发人员对什么更好的使用方法的意见。有很多方法可以将数据从一个类(以及片段)发送到另一个类
考虑碎片的生命周期问题。您可以使用事件总线来进行相同的操作,而不会遇到任何麻烦
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");
}
}
更多关于整合奥托的信息。
或者还有很多其他的选择。
片段始终与包含它的活动相连接。因此,它可以轻松地与活动进行沟通。将活动用作通信渠道或通信媒介,可以在连接到同一活动的片段之间创建通信链接
连接到某个活动的片段可以通过getActivity()方法访问该活动的实例,通过该实例,该片段可以执行诸如调用该活动的方法之类的任务
现在,要将数据从一个片段传输到另一个片段,可以在活动中创建方法,并通过该方法将一些数据存储在变量中。在另一个片段中,您可以通过其他方法访问该变量的值。这里可以使用getter和setter方法的概念
有关活动和片段通信的更多信息,请访问链接:一个使用事件总线调用优雅的解决方案,另一个调用旧的良好回调。
我的观点是避免“片段链”的情况——当一个片段直接调用另一个片段时。若活动完全处理片段替换,则它对所有5个片段具有同等的访问权限。
因此,它可以使用回调轻松地在它们之间传递数据
在这种情况下,MVP没有任何问题。演示者使用回调将数据发送到其视图(片段)。片段使用回调将数据发送到其活动。然后,活动在片段管理器中查找第5个片段,并更新/传递第5个片段中的数据
使用回调的情况似乎比事件总线更健壮,但仍然很有趣。我会用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()
关于将数据传递给acitvity或fragment,我遇到了很多问题。因此,我让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);
}
}
接收器的片段
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);
}
}
试试看:我希望你能帮忙 您不能使用SharedRef
?@RohitArya我认为这并不是比在活动中保存数据更好的解决方案。我只需要将这些数据发送到服务器,时间不长,那么单例将是一个好方法。另一方面,@Rohit Arya的建议很容易实现。另外,您还可以从SharedReferences中删除条目:SharedReferences.Editor.remove()
,以便清除up@0X0nosugar我想把逻辑和观点分开。如果我使用SharedRef
,那么我需要演示者内部的Context
。现在,对于Singleton,我只需调用getInstance
。没有链接到Context
我想到了EventBus。但我写了一篇评论来回答我的问题。我必须将片段中的数据传递给演示者。现在我在显示和检索数据的内部调用`UserData.getInstance()`。我希望代码更加优雅,如果你有什么东西的话,也要正确。把它加到你的问题里。你如何期望有人准备好回答你的问题和你的评论?