Android 在 Fragment 之间传递数据
Android pass data between Fragments
我有一个 Activity
和 5 个 Fragment
。在第一个 Fragment
用户输入 phone 数字。在最后(第五)Fragment
我需要显示这个 phone 数字,输入其他字段并将所有数据发送到服务器。对于每个 Fragment
,我使用单独的 Presenter(MVP)。
如何将数据从第一个片段传递到最后一个片段?
1) 我不想遍历所有片段链,因为它们不需要这些数据。
2) 如果将此数据存储在主机 Activity
中,我需要在 Fragment
class 中调用 ((SomeActivity)getActivity()).getUserData()
并将此数据传递给 Presenter。
3) 我选择了最后一种方法。我创建了单例 UserData class。这是简单的 POJO class。我在第一个 Fragment
集需要的数据中创建 UserData
的实例,而不是在最后一个 Fragment
中使用它来检索数据并添加缺失的字段。
但我不知道单例的方法是否正确。因为当用户转到另一个 Activity
时,我需要清除单例实例。
有没有更好的解决办法?
编辑
我想到了 EventBus。但是我必须将数据从 Fragment 传递给 Presenter。现在我在 present 中调用 UserData.getInstance()
并检索数据。我希望代码更优雅也更正确。我想听听更有经验的开发人员的意见,什么更好用。
有很多方法可以将数据从一个 class(也包括片段)发送到另一个。
考虑到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/
片段总是连接到包含它的Activity。因此,它可以轻松地与 Activity 通信。使用您的 Activity 作为交流渠道或交流媒介,您可以在附加到相同 Activity 的片段之间创建交流 link。
连接到 Activity 的片段可以通过 getActivity() 方法访问 Activity 的实例,使用这个实例,片段可以执行调用方法的任务Activity.
现在,要将数据从一个 Fragment 传输到另一个 Fragment,您可以在 Activity 中创建方法并通过该方法将一些数据存储在变量中。在另一个片段中,您可以通过其他方法访问该变量的值。这里可以使用getter和setter方法的概念。
有关Activity和Fragment通信的更多信息,请访问link:http://developer.android.com/guide/components/fragments.html#CommunicatingWithActivity
一个使用事件总线调用优雅的解决方案,另一个 - 旧的好回调。
我的观点是避免 "chain of fragments" 的情况 - 当一个片段直接调用另一个片段时。如果 activity 完全处理片段替换,它对所有 5 个片段具有相同的访问权限。
因此它可以使用回调轻松地在它们之间传递数据。
在那种情况下,MVP 没有发现任何问题。 Presenter 使用回调将数据发送到它的视图(片段)。片段使用回调将数据发送到其 Activity。 Activity 然后在片段管理器中找到第 5 个片段,在第 5 个片段中找到 update/pass 数据。
回调的情况似乎比事件总线更健壮,但仍然是品味问题。
我会用 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)Activity 中,片段可以进行通信
通过调用
使用模型
((ICustomerOwner) getActivity()).getCustomer()
我遇到过很多关于将数据相互传递给 acitvity 或 fragment 的问题。结果,我让 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 希望对你有所帮助。
我有一个 Activity
和 5 个 Fragment
。在第一个 Fragment
用户输入 phone 数字。在最后(第五)Fragment
我需要显示这个 phone 数字,输入其他字段并将所有数据发送到服务器。对于每个 Fragment
,我使用单独的 Presenter(MVP)。
如何将数据从第一个片段传递到最后一个片段?
1) 我不想遍历所有片段链,因为它们不需要这些数据。
2) 如果将此数据存储在主机 Activity
中,我需要在 Fragment
class 中调用 ((SomeActivity)getActivity()).getUserData()
并将此数据传递给 Presenter。
3) 我选择了最后一种方法。我创建了单例 UserData class。这是简单的 POJO class。我在第一个 Fragment
集需要的数据中创建 UserData
的实例,而不是在最后一个 Fragment
中使用它来检索数据并添加缺失的字段。
但我不知道单例的方法是否正确。因为当用户转到另一个 Activity
时,我需要清除单例实例。
有没有更好的解决办法?
编辑
我想到了 EventBus。但是我必须将数据从 Fragment 传递给 Presenter。现在我在 present 中调用 UserData.getInstance()
并检索数据。我希望代码更优雅也更正确。我想听听更有经验的开发人员的意见,什么更好用。
有很多方法可以将数据从一个 class(也包括片段)发送到另一个。
考虑到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/
片段总是连接到包含它的Activity。因此,它可以轻松地与 Activity 通信。使用您的 Activity 作为交流渠道或交流媒介,您可以在附加到相同 Activity 的片段之间创建交流 link。
连接到 Activity 的片段可以通过 getActivity() 方法访问 Activity 的实例,使用这个实例,片段可以执行调用方法的任务Activity.
现在,要将数据从一个 Fragment 传输到另一个 Fragment,您可以在 Activity 中创建方法并通过该方法将一些数据存储在变量中。在另一个片段中,您可以通过其他方法访问该变量的值。这里可以使用getter和setter方法的概念。
有关Activity和Fragment通信的更多信息,请访问link:http://developer.android.com/guide/components/fragments.html#CommunicatingWithActivity
一个使用事件总线调用优雅的解决方案,另一个 - 旧的好回调。 我的观点是避免 "chain of fragments" 的情况 - 当一个片段直接调用另一个片段时。如果 activity 完全处理片段替换,它对所有 5 个片段具有相同的访问权限。 因此它可以使用回调轻松地在它们之间传递数据。
在那种情况下,MVP 没有发现任何问题。 Presenter 使用回调将数据发送到它的视图(片段)。片段使用回调将数据发送到其 Activity。 Activity 然后在片段管理器中找到第 5 个片段,在第 5 个片段中找到 update/pass 数据。
回调的情况似乎比事件总线更健壮,但仍然是品味问题。
我会用 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)Activity 中,片段可以进行通信 通过调用
使用模型((ICustomerOwner) getActivity()).getCustomer()
我遇到过很多关于将数据相互传递给 acitvity 或 fragment 的问题。结果,我让 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 希望对你有所帮助。