Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android在片段之间传递数据_Java_Android_Android Fragments_Android Activity_Mvp - Fatal编程技术网

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()`。我希望代码更加优雅,如果你有什么东西的话,也要正确。把它加到你的问题里。你如何期望有人准备好回答你的问题和你的评论?