【问题标题】:Pass data between two fragments without using activity在两个片段之间传递数据而不使用活动
【发布时间】:2014-12-15 12:35:17
【问题描述】:

我想在不使用activity和fragment activity的情况下在两个fragment之间传递数据。

我不想使用这样的活动在片段之间传递数据:Communicating with Other Fragments

下面是我的场景:

我有一个父片段,里面有两个子片段。现在我需要在这两个片段之间传递数据。如何实现这一点?

我调查了这个:Event Bus,但没有得到片段的工作示例。

有没有其他方法可以在片段之间传递数据?

任何帮助将不胜感激。

根据 InnocentKiller 的回答编辑:

在 FragmentOne 中,我已经实现了:

    FragmentTwo = new FragmentTwo();
    Bundle bundle = new Bundle();
    bundle.putString("Hello", "My name is Siddharth");
    fragment.setArguments(bundle);

在 FragmentTwo 中,我已经实现了:

    Bundle bundle = this.getArguments();
    String myInt = bundle.getString("Hello","Test");
    mStartTripButton.setText(myInt);

【问题讨论】:

  • 没有Activity如何管理Fragment?
  • 你可以使用单例/静态变量
  • @M D :在我的父片段中,我有一个包含两个片段的布局文件。我的父片段在我点击导航抽屉时被调用。我的导航抽屉是主要活动。
  • @MD:我不想在我的主要活动中使用回调方法,我希望它在我的父片段中。这样做会显示 ClassCast 异常。
  • 关于 EventBus,您可以直接使用我回答中的示例。即:在片段 A 中 EventBus.getDefault().postSticky("Hello") 和片段 B 中 String hello = EventBus.getDefault().getStickyEvent(String.class)

标签: android android-activity android-fragments android-fragmentactivity


【解决方案1】:

在活动/片段、片段/片段/、活动/活动、类/类之间交换数据的最佳方式,制作一个常见的单例类,如:

public class DataHolderClass {
private static DataHolderClass dataObject = null;

private DataHolderClass() {
    // left blank intentionally
}

public static DataHolderClass getInstance() {
    if (dataObject == null)
        dataObject = new DataHolderClass();
    return dataObject;
}
private String distributor_id;;

 public String getDistributor_id() {
    return distributor_id;
 }

 public void setDistributor_id(String distributor_id) {
    this.distributor_id = distributor_id;
 }
}

现在可以在移动到新屏幕之前在任何事件的任何位置(片段、活动、类)设置

DataHolderClass.getInstance().setDistributor_id("your data");

现在可以去任何地方(片段、活动、类)

 String _data = DataHolderClass.getInstance().getDistributor_id();

【讨论】:

  • 这种方法的可靠性如何?据我所知,不能保证静态变量会保留其价值。不过看起来很方便。
  • @jdkraftz 我还没有找到参考资料,但我 99% 确信静态变量会在应用程序生命周期中保留。至少我一直在一个每天连续使用 8 小时的应用中使用这种方法,并且到目前为止没有任何问题。
【解决方案2】:

您可以使用 EventBus https://github.com/greenrobot/EventBus 在 Android 中传递任何复杂的对象。

将对象从一个 Activity 传递到另一个的示例:

在 EventBus 上添加您的对象:

EventBus.getDefault().postSticky(anyObject);
startActivity(new Intent(getActivity(), SomeActivity.class));

SomeActivity 中的任何位置:

AnyObject anyObject = EventBus.getDefault().getStickyEvent(AnyObject.class);

这个例子只是为了表明它可以跨活动工作,您可以调用getStickyEvent 来获取代码中任何位置的anyObject。

因此,您可以在 Fragment A 中发布一个对象,并在 Fragment B 中使用 getStickyEvent 来检索它。

如果您有很多参数和/或想要从一个地方移动到另一个地方的复杂对象,这将特别方便。只需为参数创建一个包含 getter/setter 的“持有者”对象,然后将其传递。比必须单独传递它们并以某种方式序列化复杂对象要简单得多。

【讨论】:

  • +1 用于全球可用的库。但仅此一项任务就有点繁重了。构建自己的数据持有者更轻松。
  • @SubinSebastian 你是对的,实际上最近在许多情况下都转换为时间静态持有者。 EventBus 虽然提供了其他非常好的功能,例如广播复杂对象。例如,基于服务事件更新 UI 突然变得很容易。即使想要传达非平凡的数据。
  • 另外它根本不适合这个!你不能在不参与主机活动的情况下将数据从一个片段传递到另一个片段,这很尴尬!
  • 这可能很尴尬,但是您可以使用此方法或@De 描述的静态持有者
【解决方案3】:

我认为您正在尝试将数据从一个片段传递到另一个片段,因此请尝试使用以下代码。

使用 Bundle,因此在您要发送数据的第一个片段中编写以下代码。

Fragment fragment = new Fragment();
Bundle bundle = new Bundle();
bundle.putString("message", "From Activity");
fragment.setArguments(bundle);

要检索该数据,请在您的其他片段中使用以下代码

String strtext=getArguments().getString("message");

【讨论】:

  • 这个解决方案听起来不错..会试一试,让你知道..谢谢
  • 我将 bundle 设为 null。
  • 可能是您传递的值为空,或者可能是其他问题。没有看到你的代码就不能说什么。
  • @SiddharthVyas 但是在这里设置参数后你必须提交你的Fragment Transaction...
  • @SiddharthVyas,检查我的编辑,请从您的第一个片段而不是 Int 传递字符串值,然后在第二个片段中获取密钥...不要传递任何值
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-03
  • 1970-01-01
  • 2018-04-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多